19. Remove Nth Node From End of List

19. Remove Nth Node From End of List
Photo by Markus Spiske / Unsplash

題目描述

題目連結:19. Remove Nth Node From End of List

題意

給定一個鏈結串列,以及一個數字 n,移除鏈結串列倒數第 n 個節點。

限制

  • 鏈結串列中的節點數為 sz
  • 1 <= sz <= 30
  • 0 <= Node.val <= 100
  • 1 <= n <= sz

思考

  • 雙遍歷法:首先走訪鏈結串列至末端計算總長度,然後計算 長度 - n,再從頭移動 長度 - n 次來找到並移除目標節點。
  • 單遍歷法(One pass):利用快慢指標
    • 先將 fast 指標向前移動 n 次。
    • slow 指標從頭開始。
    • 同時移動兩個指標,直到 fast 到達末端。此時,slow 正好位於倒數第 n 個節點的前一個節點。

解法

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        if (!head->next) {
            return nullptr;
        }
        auto fast = head;
        while (n--) {
            fast = fast->next;
        }

        if (!fast) {
            return head->next;
        }

        auto slow = head;
        while (fast->next) {
            slow = slow->next;
            fast = fast->next;
        }

        slow->next = slow->next->next;
        return head;
    }
};