给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
解法一:迭代法
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
ListNode* virtualHead = new ListNode(0); // 虚拟头指针
virtualHead->next = head; // 虚拟指向原本的head
ListNode* cur = virtualHead; // 哨兵指针
// 只有后面有两个数才交换
while (cur->next != NULL && cur->next->next != NULL) {
ListNode* node1 = cur->next;
ListNode* node2 = cur->next->next;
cur->next = node2;
node1->next = node2->next;
node2->next = node1; // 此时是 cur->node2->node1,所以要把 cur 指向node1
cur = node1;
}
return virtualHead->next;
}
};
解法二:递归
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
if (head == nullptr || head->next == nullptr) {
return head;
}
ListNode* newHead = head->next;
head->next = swapPairs(newHead->next);
newHead->next = head;
return newHead;
}
};