题目描述:
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例 1:
输入:head = [1,2,3,4] 输出:[2,1,4,3]
示例 2:
输入:head = [] 输出:[]
示例 3:
输入:head = [1] 输出:[1]
提示:
- 链表中节点的数目在范围
[0, 100]
内 0 <= Node.val <= 100
解题思路:
图片来源【灵茶山艾府】
代码
class Solution { public: ListNode* swapPairs(ListNode* head) { // 对象在栈上分配内存,不需要手动释放内存 // 指针在堆上分配内存,需要手动释放内存,避免内存泄漏 ListNode dummy(0,head); //初始化列表的形式创建对象,作为哨兵节点 auto node0=&dummy; auto node1=head; // 至少有两个节点 while(node1 && node1->next){ auto node2=node1->next; auto node3=node2->next; node0->next=node2;//0->2 node2->next=node1;//2->1 node1->next=node3;//3->1 // 下一轮交换, node0=node1; //0是1 node1=node3; //1是3 } return dummy.next; } };思路总结:
- 引入哨兵节点:dummy对象作为哨兵节点,简化对链表头结点的处理逻辑
- 交换与遍历:使用多个指针遍历链表,在每次循环中找到待交换的两个结点及其后续结点,进行节点交换,然后更新指针,准备下一轮的交换
- 返回结果:循环结束,dummy.next作为新链表的头结点