Leetcode24 兩兩交換連結串列中的節點
阿新 • • 發佈:2018-11-13
給定一個連結串列,兩兩交換其中相鄰的節點,並返回交換後的連結串列。
示例:
給定 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; } };