1. 程式人生 > >Leetcode24 兩兩交換連結串列中的節點

Leetcode24 兩兩交換連結串列中的節點

 

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

示例:

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

說明:

  • 你的演算法只能使用常數的額外空間。
  • 你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。

 【解題思路】

要交換兩個節點,首先需要兩個指標指向這兩個節點。其次因為頭結點可能會發生變動,因此這種情況一般都要引入一個表頭節點。具體思路見下圖解:

1.新建一個表頭節點,然後用它來初始化兩個用來交換節點的指標:

2.按照上圖1、2、3三步來進行節點順序的更換,注意順序問題!!必須仔細檢查每一步的連結串列是否斷開和連線?像這裡很容易忽略第三步。

3.然後接著進行指標的轉移:

4.不斷迴圈,直到終止條件

5. 那麼如何判斷終止條件?雖然有奇數和偶數兩種情況,在每次 left 移位到新的位置上時, 要同時判斷left->next和left->next->next是否等於空?只要有一個為空,則停止迴圈。

【程式碼實現】

程式碼中我用的是pre、slow和fast:

class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        if(head==NULL || head->next==NULL)
            return head;
        ListNode* pre = new ListNode(-1);
        ListNode* NewH = head->next;
        pre->next = head;
        ListNode* slow;
        ListNode* fast;
        while(pre->next && pre->next->next){
            slow = pre->next;
            fast = pre->next->next;
            slow->next = fast->next;
            fast->next = slow;
            pre->next = fast;
            pre = slow;
        }
        return NewH;
    }
};