题目描述
给定一个链表,删除链表的倒数第 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;
}
}