一、问题
二、解题代码
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy = new ListNode(-1);
dummy.next = head;
// 删除倒数第 n 个,要先找倒数第 n + 1 个节点,即要删除节点的前一个节点
ListNode preNode = findFromEnd(dummy, n + 1);
// 删掉倒数第 n 个节点
preNode.next = preNode.next.next;
return dummy.next;
}
/**
* 查找倒数第k个节点
*/
private ListNode findFromEnd(ListNode head, int k) {
ListNode slow = head;
ListNode fast = head;
// 快指针先走 k 步
for (int i = 0; i < k; i++) {
fast = fast.next;
}
// 快慢指针同时走 n - k 步
while (fast != null) {
slow = slow.next;
fast = fast.next;
}
// 慢指针现在指向第 n - k个节点,即倒数第 k 个节点
return slow;
}