19. Remove Nth Node From End of List
題目描述
題目連結: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;
}
};
Comments ()