文章目录
- 3.两两交换链表中的节点
- 3.1题目
- 3.2解法:虚拟头节点
3.两两交换链表中的节点
3.1题目
24.两两交换链表中的节点——力扣链接
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例 1:
- 示例一:
输入:head = [1,2,3,4]
输出:[2,1,4,3]
- 示例二:
输入:head = [1]
输出:[1]
3.2解法:虚拟头节点
- 核心:适用虚拟头节点
- 逻辑:每次循环分为三步(在此之前,需要保存第一个节点链接、以及链表后面节点的链接)
- 头节点连接第二个节点
- 第二个节点反转连接第一个节点
- 第一个节点连接后面的链表节点
- 如图:初始化
- 操作之后:
public ListNode swapPairs(ListNode head) {//使用虚拟头节点方法ListNode dummy=new ListNode(-1,head);ListNode cur=dummy;while(cur.next!=null && cur.next.next!=null){ListNode tmp1=cur.next; //保存第一个节点ListNode tmp2=cur.next.next.next;cur.next=cur.next.next; //连接第二个节点cur.next.next=tmp1; //反转,连接第一个节点cur.next.next.next=tmp2; //连接后面的节点cur=cur.next.next; //cur移动两位,下一个头节点}return dummy.next;}