题目描述:
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例 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->2node2->next=node1;//2->1node1->next=node3;//3->1// 下一轮交换,node0=node1; //0是1node1=node3; //1是3 }return dummy.next;} };
思路总结:
- 引入哨兵节点:dummy对象作为哨兵节点,简化对链表头结点的处理逻辑
- 交换与遍历:使用多个指针遍历链表,在每次循环中找到待交换的两个结点及其后续结点,进行节点交换,然后更新指针,准备下一轮的交换
- 返回结果:循环结束,dummy.next作为新链表的头结点