解题思路
利用双指针,将快指针提前前进 n + 1 个节点,然后同时移动快慢指针。当快指针指向 null 时,慢指针恰好指向需要删除的节点的前一节点。
注意需要设置哨兵节点,否则对于只有一个节点的链表,该算法无法处理。
Java代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode guard = new ListNode(0);
guard.next = head;
ListNode fast = guard;
ListNode slow = guard;
for (int i = 0; i <= n; i++) fast = fast.next;
while (fast != null) {
fast = fast.next;
slow = slow.next;
}
slow.next = slow.next.next;
return slow == guard ? slow.next : head;
}
}
本文介绍了一种使用双指针方法删除链表中倒数第N个节点的有效算法。通过设置快慢两个指针,并使快指针先向前移动n+1个位置,之后同步移动两指针直至快指针到达链表尾部,此时慢指针正好位于待删除节点的前一个节点处。为了处理特殊情况,如只有一个节点的链表,算法引入了哨兵节点。
511

被折叠的 条评论
为什么被折叠?



