题目描述
思路解析动画文字版
哑结点让「换第一组」和后面各组写法完全一致,不必为头节点单独写特例。下面每一组都在套这三步。
哑结点 D 接在头节点 1 前面,pre 指向 D。只要 pre 后面还有「两个」节点,就交换这一组。
第 1 组:pre=D,first=pre.next=1,second=first.next=2。目标——让 2 排到 1 前面,即这一组变成 2→1。
第一根:first.next = second.next,让 1 先接住「下一组」的 3(nxt 指着它)。先记住后面,等会儿断开也不丢链。
第二根:second.next = first,让 2 指回 1(图上这一对的箭头掉成 ←)。现在这一组内部已经是 2→1 的顺序。
第三根:pre.next = second,让前驱 D 接到后一个 2——这一组彻底接好(变绿)。然后 pre 跳到 1(它现在是这一组的尾),作为下一组的前驱。
第 2 组:pre=2,first=pre.next=3,second=first.next=4。目标——让 4 排到 3 前面,即这一组变成 4→3。
第一根:first.next = second.next,让 3 先接住「下一组」的 5(nxt 指着它)。先记住后面,等会儿断开也不丢链。
第二根:second.next = first,让 4 指回 3(图上这一对的箭头掉成 ←)。现在这一组内部已经是 4→3 的顺序。
第三根:pre.next = second,让前驱 2 接到后一个 4——这一组彻底接好(变绿)。然后 pre 跳到 3(它现在是这一组的尾),作为下一组的前驱。
第 3 组:pre=4,first=pre.next=5,second=first.next=6。目标——让 6 排到 5 前面,即这一组变成 6→5。
第一根:first.next = second.next,让 5 先接住「下一组」的 7(nxt 指着它)。先记住后面,等会儿断开也不丢链。
第二根:second.next = first,让 6 指回 5(图上这一对的箭头掉成 ←)。现在这一组内部已经是 6→5 的顺序。
第三根:pre.next = second,让前驱 4 接到后一个 6——这一组彻底接好(变绿)。然后 pre 跳到 5(它现在是这一组的尾),作为下一组的前驱。
第 4 组:pre=6,first=pre.next=7,second=first.next=8。目标——让 8 排到 7 前面,即这一组变成 8→7。
第一根:first.next = second.next,这里 second 后面是 null,所以 7 接向 null(它将成为整条链的表尾)。
第二根:second.next = first,让 8 指回 7(图上这一对的箭头掉成 ←)。现在这一组内部已经是 8→7 的顺序。
第三根:pre.next = second,让前驱 6 接到后一个 8——这一组彻底接好(变绿)。然后 pre 跳到 7;后面不足两个节点,循环结束。
四组都交换完,pre 走到尾后 pre.next 不足两个、循环结束。返回 dummy.next,新头是 2。整条变成 2→1→4→3→6→5→8→7。
空 / 单节点 / 奇数长度先想清,哑结点 + while 双条件天然覆盖。
三个高频追问,哑结点 + 三指针接缝是所有「分组重连」题的原子操作。
参考代码
def swapPairs(head): dummy = ListNode(0, head) pre = dummy while pre.next and pre.next.next: first = pre.next second = first.next first.next = second.next # ① 前者接下一组 second.next = first # ② 后者指回前者 pre.next = second # ③ 前驱接后者 pre = first # 前者成新尾,做下一组前驱 return dummy.next复杂度
- 时间:O(n),每个节点只处理一次,逐对推进
- 空间:O(1),只用 dummy/pre/first/second 几个指针,原地交换
易错点
面试追问把动画讲成自己的话
追问能不能只交换节点里的值,不改指针?
追问递归怎么写?
追问推广到「每 k 个一组翻转」(LC25) 怎么变?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
旋转链表
LeetCode 61 · 中等 · 沿着 链表 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题