天天看點

連結清單-雙指針-力扣19. 删除連結清單的倒數第 N 個結點1. 題目2. 思路3. 代碼

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;
    }
}