1. 程式人生 > 實用技巧 >LeetCode19刪除連結串列的倒數第N個節點

LeetCode19刪除連結串列的倒數第N個節點

題目連結

https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/

題解一

  • 雙指標:一個“快”,一個“慢”
  • 快指標先到達連結串列末尾
  • 具體思路見程式碼及註釋
// Problem: LeetCode 19
// URL: https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/
// Tags: Linked List Two Pointers Recursion
// Difficulty: Medium

#include <iostream>
using namespace std;

struct ListNode{
    int val;
    ListNode* next;
};

class Solution{
public:
    // 刪除連結串列的倒數第N個節點
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        // 快慢指標
        ListNode* fast = head, *slow = head;
        // 快指標先移動N+1步,慢指標不移動
        int i = 0;
        while (i <= n && fast != nullptr){
            fast = fast->next;
            i++;
        }
        // 這個if語句和上個while迴圈中的fast!=nullptr都是為了處理一種特殊情況:
        // 假如連結串列只有N個元素且要刪除倒數第N個元素,則快指標不能移動N+1步,這時應直接刪除頭節點
        if(i!=n+1){
            // 刪除頭節點並返回新連結串列
            head = head->next;
            delete slow;
            return head;
        }
        // 快指標和慢指標一起移動直至快指標為空
        // 因為快指標先移動了n+1步,所以迴圈結束後慢指標是指向待刪除節點前面的那個節點
        while(fast!=nullptr){
            fast = fast->next;
            slow = slow->next;
        }
        // 刪除待刪除的節點並返回新連結串列
        fast = slow->next;
        slow->next = fast->next;
        delete fast;
        return head;
    }
};

題解二

  • 遞迴寫法,很厲害,我參考了別人的
// Problem: LeetCode 19
// URL: https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/
// Tags: Linked List Two Pointers Recursion
// Difficulty: Medium

#include <iostream>
using namespace std;

struct ListNode{
    int val;
    ListNode* next;
};

class Solution{
private:
    int index=0;
public:
    // 刪除連結串列的倒數第N個節點
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        if(head == nullptr) return nullptr;
        // 遞迴表示式
        head->next = removeNthFromEnd(head->next, n);
        // 該變數用來標記是倒數第幾個節點,這條語句寫在了遞迴表示式之後,這很關鍵
        index++;
        // 此時head即為待刪除節點前邊的那個節點
        if(index == n) return head->next;
        return head;
    }
};

作者:@臭鹹魚

轉載請註明出處:https://www.cnblogs.com/chouxianyu/

歡迎討論和交流!