題目:給定一個鏈表,兩兩交換其中相鄰的節點,並返回交換後的鏈表。
注意:你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。
示例:
給定 1->2->3->4, 你應該返回 2->1->4->3.
一直都不會寫遞歸,可能是沒有那個腦子嗚嗚嗚。今天強行寫了一下。下面給出兩個版本,第一個非遞歸,第二個遞歸。
非遞歸版本:(不要嫌棄我代碼寫的醜)
(我好難受....爲啥正不過來)
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
ListNode* Pre, *Node, *Next, *ans;
ListNode* PreNode = new ListNode(0);
ans = PreNode; //存一個返回值
Pre = head; //存要交換的兩個位置的第一個元素
Node = Pre?Pre->next:NULL; //存要交換的兩個位置的第二個元素
while(Node){
/*重新建立鏈路關係*/
Next = Node->next;
PreNode->next = Node;
Node->next = Pre;
Pre->next = Next;
/*更新節點位置*/
PreNode = Pre;
Pre = Next;
Node = Next?Next->next:NULL;
}
return ans->next;
}
};
遞歸版本:
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
if(head == NULL || head->next == NULL) return head; //終止條件
ListNode* node = head->next;
head->next = swapPairs(head->next->next);
node->next = head;
return node;
}
};
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/swap-nodes-in-pairs
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。