1. 程式人生 > 其它 >19 刪除連結串列的倒數第 N 個結點(LeetCode HOT 100)

19 刪除連結串列的倒數第 N 個結點(LeetCode HOT 100)

描述:
給你一個連結串列,刪除連結串列的倒數第 n 個結點,並且返回連結串列的頭結點。

示例 1:

輸入:head = [1,2,3,4,5], n = 2
輸出:[1,2,3,5]

示例 2:

輸入:head = [1], n = 1
輸出:[]

示例 3:

輸入:head = [1,2], n = 1
輸出:[1]

提示:
連結串列中結點的數目為 sz
1 <= sz <= 30
0 <= Node.val <= 100
1 <= n <= sz

Soulution:

public static ListNode removeNthFromEnd(ListNode head, int n) {
        // 避免只有一個結點的情況,我們使用哨兵優化
        ListNode sentry = new ListNode(-1, head);
        ListNode sp = sentry;
        ListNode fp = sentry;
        // 快指標先走
        for (int i = 0; i < n; ++i) {
            fp = fp.next;
        }
        // 快指標到末尾時,慢指標剛好到倒數第n個結點前
        while (fp != null && fp.next != null) {
            fp = fp.next;
            sp = sp.next;
        }
        sp.next = sp.next.next;
        return sentry.next;
    }

Idea:
快慢指標,O(n)時間找到倒數第N個結點,並完成remove。
哨兵結點,簡化邊界條件處理,如只有一個結點的情況。

Reslut: