/**
* 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 fast;
ListNode slow;
fast = head;
slow = head;
// 快指针先移动 n 步
while (n-- > 0) {
fast = fast.next;
}
// 当且仅当 n 为节点个数时,快指针才走到链表尾部,倒数第 n 个节点即头节点
if (fast == null) {
return head.next;
}
// 慢指针和快指针同步移动
while (fast != null && fast.next != null) {
fast = fast.next;
slow = slow.next;
}
// 倒数第 n 个节点即正数第 k - n + 1 个节点(k 为节点个数) 此时 slow 为第 k - n 个节点
// slow.next 即倒数第 n 个节点,指针指向下一个节点
slow.next = slow.next.next;
return head;
}
}