目录
题目:

题解:
递归法不太好理解,这里讲解迭代法。
-
哨兵节点兜底:创建虚拟头节点(dummyHead)指向原链表头,统一所有节点对的交换逻辑(避免头节点交换的特殊处理);
-
循环遍历交换:用临时指针从哨兵节点开始,每次定位其后两个待交换节点(node1、node2),通过三步指针调整完成交换:
temp→next = node2(把 node2 接到 temp 后); node1→next = node2→next(保留 node2 后续链表); node2→next = node1(完成两两交换); -
指针后移迭代:将临时指针移到交换后的第二个节点(node1),重复上述交换,直到剩余节点不足两个;
-
清理返回:记录哨兵节点的 next(新链表头),释放哨兵节点内存,返回结果。
C++代码:
/**
* 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* prehead = new ListNode(0);
prehead->next = head;
ListNode* temp = prehead;
while(temp->next && temp->next->next){
ListNode* node1 = temp->next;
ListNode* node2 = temp->next->next;
//交换的三个步骤
temp->next = node2;
node1->next = node2->next;
node2->next = node1;
temp = node1; //更新temp的值容易忘;
}
ListNode* ans = prehead->next;
delete prehead;
return ans; // 返回交换后的链表头
}
};