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