给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
思路:用虚拟头节点,每次指针指向两两交换的节点的前一个节点,进行交换操作然后指针向后移动两位重复操作(进行迭代),直达指针下一个或下下个节点为空。
其中两两交换的过程分三步:
步骤1后cur和1节点的链接会断开,所以进行前需要cur->next赋值给temp指针;步骤2同理;
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
ListNode* dummyHead = new ListNode(0); // 设置一个虚拟头结点
dummyHead->next = head; // 将虚拟头结点指向head,这样方面后面做删除操作
ListNode* cur = dummyHead;
while(cur->next != nullptr && cur->next->next != nullptr) {
ListNode* tmp = cur->next; // 记录临时节点
ListNode* tmp1 = cur->next->next->next; // 记录临时节点
cur->next = cur->next->next; // 步骤一
cur->next->next = tmp; // 步骤二
cur->next->next->next = tmp1; // 步骤三
cur = cur->next->next; // cur移动两位,准备下一轮交换
}
return dummyHead->next;
}
};
如果先进行步骤2,再进行步骤1,可以将temp指针省去。代码实现为:
cur->next->next->next = cur->next; // 步骤一
cur->next= cur->next->next; // 步骤二
cur->next->next->next = tmp1; // 步骤三