删除链表的倒数第N个节点
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点
示例 :
输入: head = [1,2,3,4,5], n = 2
提示:
- 链表中结点的数目为 sz
- 1 <= sz <= 30
- 0 <= Node.val <= 100
- 1 <= n <= sz
双指针
要删除倒数第n
个节点,让p
移动n
步,然后让p
和q
同时移动,直到p
指向链表末尾
删掉q
所指向的节点
- 设置虚拟节点
dummyHead
指向head
- 设定双指针
p
和q
,初始都指向虚拟节点dummyHead
- 移动
q
,直到p
与q
之间相隔的元素个数为n
- 同时移动
p
与q
,直到q
指向的为NULL
- 将
p
的下一个节点指向下下个节点
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummyHead = new ListNode(-1);
dummyHead.next = head;
ListNode p = dummyHead;
ListNode q = dummyHead;
while (n-- > 0) {
p = p.next;
}
// 待删除节点q的上一节点
ListNode prev = null;
while (p != null) {
prev = q;
q = q.next;
p = p.next;
}
// 上一节点的next指针绕过 待删除节点q 直接指向q的下一节点
prev.next = q.next;
// 释放 待删除节点q 的next指针
q.next = null;
return dummyHead.next;
}
}