题目描述

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

示例:

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

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

说明:

给定的 n 保证是有效的。

进阶:

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

题目解析:

采用双重遍历肯定是可以解决问题的,但是题目要求我们 一次遍历解决问题,那我们的思路得散发一下。

我们可以设想假设设定了双指针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;

}

}