1. 程式人生 > 實用技巧 >兩兩交換連結串列的節點

兩兩交換連結串列的節點

兩兩交換連結串列節點

給定一個連結串列,兩兩交換其中相鄰的節點,並返回交換後的連結串列。
例如:

給定 1->2->3->4, 你應該返回 2->1->4->3。

在看到這道題目的時候,我感覺很簡單,可能就是邊界條件需要注意一下,我們需要一個指標在整個連結串列上進行移動,這個指標每次都是移動兩步。這樣的話基本就可以實現兩兩交換
程式碼如下

class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        if (head == nullptr || head->next == nullptr)
            return head;
        ListNode* dummy = new ListNode(-1);
        dummy->next  = head;
        ListNode* pre = dummy->next;
        ListNode* next = pre ->next;
        while (pre && next){
            int temp = next->val;
            next->val = pre->val;
            pre->val = temp;
            pre = pre->next->next;
            if (pre)
                next = pre ->next;
        }
        return dummy->next;
    }
};

實現了兩兩互換,但是發現執行的效率非常的低,雙\(5\%\),看見了題目的要求:你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換

在具體實現上,我們建立頭結點,然後在交換上,改變節點之間的連線關係那麼就需要這兩個需要交換順序節點的先前結點,在下面的程式中,temp節點其實就是那個先前的節點。在進行交換的時候,需要設定兩個變數對需要交換的節點進行記錄。方便我們的實現。

class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        ListNode* dummyHead = new ListNode(0);
        dummyHead->next = head;
        ListNode* temp = dummyHead;
        while (temp->next != nullptr && temp->next->next != nullptr) {
            ListNode* node1 = temp->next; // pre
            ListNode* node2 = temp->next->next; // next
            temp->next = node2;
            node1->next = node2->next;
            node2->next = node1;
            temp = node1;
        }
        return dummyHead->next;
    }
};