【LeetCode】 删除链表的倒数第 N 个节点

题目描述指针

给定一个链表,删除链表的倒数第 n 个节点,而且返回链表的头结点。rem

示例:io

给定一个链表: 1->2->3->4->5, 和 n = 2.ast

当删除了倒数第二个节点后,链表变为 1->2->3->5.class

说明:List

给定的 n 保证是有效的。进阶

进阶:遍历

你能尝试使用一趟扫描实现吗?im

题目解析:链表

采用双重遍历确定是能够解决问题的,可是题目要求咱们 一次遍历解决问题,那咱们的思路得散发一下。

咱们能够设想假设设定了双指针p和q,当q指向末尾的NULL时,p和q之间相隔的元素个数为n时,那么删除掉p的下一个指针就完成了要求。

1.设置虚拟节点dummyHead指向head

2.设定双指针p和q,初始都指向虚拟节点dummyHead

3.移动q,直到p和q之间相隔的元素个数为n

4.同时移动p与q,知道q指向的为NULL

5.将p的下一个节点指向下下一个节点。


public class Solution3 {

public ListNode removeNthFromEnd(ListNode head, int n) {

//建立一个虚拟头结点

ListNode dummy = new ListNode(-1);

dummy.next =head;

ListNode fast = dummy;

ListNode slow = dummy;

while(fast !=null && n>-1){

fast = fast.next; n--;

}

while(fast!=null){

fast = fast.next;

slow = slow.next;

}

slow.next = slow.next.next;

return dummy.next;

}

}