解题思路
利用双指针,将快指针提前前进 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;
}
}