24.两两交换链表中的节点(中等)
方法一:递归
思路
代码
/**
* 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 || !head->next) return head;
ListNode *newHead = head->next;
head->next = swapPairs(newHead->next);
newHead->next = head;
return newHead;
}
};
方法二:迭代
思路
-
创建虚拟节点 dummy,令 dummy->next = head,因此最后只需要返回
dummy->next
。令 cur 表示当前到达的节点,初始时 cur = dummy。每次需要交换 cur 后面的两个节点。 -
如果 temp 的后面没有节点或者只有一个节点,则没有更多的节点需要交换,因此结束交换。
-
否则,获得 cur 后面的两个节点 node1 和 node2,通过更新节点的指针关系实现两两交换节点。
-
具体而言,交换之前的节点关系是
cur -> node1 -> node2
,交换之后的节点关系要变成cur -> node2 -> node1
,因此需要进行如下操作:cur->next = node2; node1->next = node2->next; node2->next = node1;
-
完成上述操作之后,节点关系即变成
cur -> node2 -> node1
。再令 cur = node1,对链表中的其余节点进行两两交换
,直到全部节点都被两两交换。 -
两两交换链表中的节点之后,新的链表的头节点是 dummy->next,返回新的链表的头节点即可。
代码
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
ListNode *dummy = new ListNode(0), *cur=dummy;
dummy->next = head;
while(cur->next && cur->next->next){
ListNode *node1 = cur->next, *node2 = cur->next->next;
cur->next = node2;
node1->next = node2->next;
node2->next = node1;
cur = node1;
}
return dummy->next;
}
};