【LeetCode】C++ :中等題 - 連結串列 24. 兩兩交換連結串列中的節點
阿新 • • 發佈:2021-01-27
難度中等793
給定一個連結串列,兩兩交換其中相鄰的節點,並返回交換後的連結串列。
你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。
示例 1:
輸入:head = [1,2,3,4] 輸出:[2,1,4,3]示例 2:
輸入:head = [] 輸出:[]示例 3:
輸入:head = [1] 輸出:[1]提示:
- 連結串列中節點的數目在範圍
[0, 100]
內0 <= Node.val <= 100
進階:你能在不修改連結串列節點值的情況下解決這個問題嗎?(也就是說,僅修改節點本身。)
1. 迭代
這個和我想法一模一樣,可惜我自己能力還很欠缺沒能實現,原因在於,我沒有用到前驅,只用了兩個節點。
這個方法裡面用到了tmp節點相當於是前驅這樣的角色,然後每次node1 和 node2 交換後,把tmp 指向到node1 節點位置,依次進行下一個迴圈。
還有一個學習的地方,這個while迴圈的判斷條件比我寫的要嚴格。確實應該判斷的是兩個節點都不能空,我當時只判斷了第二個接地那不能空。
這個題目還是學習到了,也把自己思路和實現捋了捋。加油!
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */ class Solution { public: ListNode* swapPairs(ListNode* head) { ListNode* dummy = new ListNode(0, head); ListNode* tmp = dummy; while(tmp->next != nullptr && tmp->next->next != nullptr){ ListNode* node1 = tmp->next; ListNode* node2 = tmp->next->next; tmp->next = node2; node1->next = node2->next; node2->next = node1; tmp = node1; } return dummy->next; } };
2、遞迴
這個遞迴我沒太看明白程式碼,思路是知道的,遞迴啊。。。
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */ class Solution { public: ListNode* swapPairs(ListNode* head) { if(head == nullptr || head->next == nullptr){ return head; } ListNode* newNode = head->next; head->next = swapPairs(newNode->next); newNode->next = head; return newNode; } };