1. 題目
題目連結: 19. 删除連結清單的倒數第 N 個結點.
2. 思路
- 雙指針:定義兩個指針,fast和slow,先讓fast向前移動N次,然後再一起移動到fast為最後一個節點,此時slow在被删除的倒數第N個節點的前一個節點,隻需要slow.next = slow.next.next即可。
當被删除的是head的時候,即N與連結清單的節點數量一樣的時候,此時移動完成後,fast已經為null,是以隻需要将head向後移動一次即可,即head = head.next;
3. 代碼
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
if (head.next == null) return null;
// 定義兩個指針
ListNode slow = head;
ListNode fast = head;
// 讓快的指針前進n個
while (n > 0) {
fast = fast.next;
n--;
}
// 同時移動slow和fast到連結清單末尾
while (fast != null && fast.next != null) {
fast = fast.next;
slow = slow.next;
}
// 如果删除的是頭結點則單獨考慮
if (fast == null) head = head.next;
else slow.next = slow.next.next;
return head;
}
}