腾讯一面,面试官:“Agent和计算机基础都掌握的不错,写算法题吧,两两交换链表中的节点”,我汗流浃背,没写出来,一面挂了。。。
现在学生求职,也不太注重算法题了, 不少 面试候选人, 网络,操作系统,Agent、工作流,RAG 如数家珍。
面试官也相当满意,本以为想 出一道简单算法题,就让你过了,结果 简单题也没写出来。
这种情况,实在是过不了。。。。面评没法写,不可能你没写出来,面试官为了让你过,在面评上,在代码那里给你打个✅。
两两交换链表中的节点,还是很基本的题目的,出这种题,面试官就是想让你过的。
这道题目最近在 腾讯、字节、阿里都有考察:

腾讯AI平台部

字节一面

阿里平头哥
24、 两两交换链表中的节点
力扣链接:https://leetcode.cn/problems/swap-nodes-in-pairs/
题目描述
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例 1:
输入:head = [1,2,3,4]输出:[2,1,4,3]
示例 2:
输入:head = []输出:[]
示例 3:
输入:head = [1]输出:[1]
提示:
- 链表中节点的数目在范围
[0, 100]内 0 <= Node.val <= 100
思路
题目要求交换节点,而不是交换节点里的数值。也就是说,我们真正要做的是改变 next 指针的指向。
如果直接从头结点开始操作,第一个结点交换之后,链表的头结点就变了,还要专门处理返回值。怎么统一这种情况呢?
那么就应该想到虚拟头结点了。
令 dummy->next = head,再让 cur 指向 dummy。这样每轮要交换的两个结点就是:
first = cur->nextsecond = cur->next->next
但只知道这两个结点还不够。交换之后,原来的第一个结点还要接回后面的链表,所以需要先保存:
ListNode* nextPair = second->next;
接下来怎样修改指针,才不会把链表弄断呢?按下面三步来:
cur->next = second;second->next = first;first->next = nextPair;
三步完成后,局部链表就从:
cur -> first -> second -> nextPair
变成了:
cur -> second -> first -> nextPair
此时谁是下一轮待交换结点的前一个结点?
正是交换后的 first,所以令 cur = first,继续处理下一对节点。
循环什么时候结束呢?只有 cur 后面至少还有两个结点时,才能进行交换,因此条件是:
cur->next != nullptr && cur->next->next != nullptr
虚拟头结点统一了头结点的处理,而先保存后继节点、再按顺序修改三条指针,是本题不丢节点的关键。
模拟过程
为了把奇数个节点的情况也讲清楚,以 head = [1,2,3,4,5] 为例。
先创建虚拟头结点,令 cur = dummy。本轮要交换节点 1 和节点 2,同时先保存节点 3,保证改变指针后仍能找到后面的链表。

接下来按顺序修改三条指针:cur->next 指向节点 2,节点 2 指向节点 1,节点 1 再指回节点 3。第一对节点交换完成,链表变为 [2,1,3,4,5]。

让 cur 移动到节点 1,下一轮用同样的方法交换节点 3 和节点 4。此时节点 5 后面没有第二个节点,循环结束,节点 5 保持不动,最终结果为 [2,1,4,3,5]。

很多录友容易在写完三步指针操作后,让 cur 只移动一位。注意交换后 first 已经变成这一对节点的尾部,下一轮必须从 first 后面开始检查,所以直接令 cur = first 最清晰。
解题代码
class Solution {public: ListNode* swapPairs(ListNode* head) { ListNode dummy(0, head); // 虚拟头结点,统一第一对节点的交换 ListNode* cur = &dummy; while (cur->next != nullptr && cur->next->next != nullptr) { ListNode* first = cur->next; ListNode* second = first->next; ListNode* nextPair = second->next; // 先保存后继节点,避免断链 cur->next = second; second->next = first; first->next = nextPair; cur = first; // first 已成为本轮交换后的尾结点 } return dummy.next; }};
复杂度分析
时间复杂度:O(n),每个节点只会被处理一次。
空间复杂度:O(1),只使用了常数个指针。
其他语言
Python3
class Solution: def swapPairs(self, head): dummy = ListNode(0, head) cur = dummy while cur.next and cur.next.next: first = cur.next second = first.next next_pair = second.next cur.next = second second.next = first first.next = next_pair cur = first return dummy.next
Java
class Solution { public ListNode swapPairs(ListNode head) { ListNode dummy = new ListNode(0, head); ListNode cur = dummy; while (cur.next != null && cur.next.next != null) { ListNode first = cur.next; ListNode second = first.next; ListNode nextPair = second.next; cur.next = second; second.next = first; first.next = nextPair; cur = first; } return dummy.next; }}
Go
func swapPairs(head *ListNode) *ListNode { dummy := &ListNode{Val: 0, Next: head} cur := dummy for cur.Next != nil && cur.Next.Next != nil { first := cur.Next second := first.Next nextPair := second.Next cur.Next = second second.Next = first first.Next = nextPair cur = first } return dummy.Next}
JS
var swapPairs = function(head) { const dummy = new ListNode(0, head); let cur = dummy; while (cur.next !== null && cur.next.next !== null) { const first = cur.next; const second = first.next; const nextPair = second.next; cur.next = second; second.next = first; first.next = nextPair; cur = first; } return dummy.next;};
学AI大模型的正确顺序,千万不要搞错了
🤔2026年AI风口已来!各行各业的AI渗透肉眼可见,超多公司要么转型做AI相关产品,要么高薪挖AI技术人才,机遇直接摆在眼前!
有往AI方向发展,或者本身有后端编程基础的朋友,直接冲AI大模型应用开发转岗超合适!
就算暂时不打算转岗,了解大模型、RAG、Prompt、Agent这些热门概念,能上手做简单项目,也绝对是求职加分王🔋

📝给大家整理了超全最新的AI大模型应用开发学习清单和资料,手把手帮你快速入门!👇👇
学习路线:
✅大模型基础认知—大模型核心原理、发展历程、主流模型(GPT、文心一言等)特点解析
✅核心技术模块—RAG检索增强生成、Prompt工程实战、Agent智能体开发逻辑
✅开发基础能力—Python进阶、API接口调用、大模型开发框架(LangChain等)实操
✅应用场景开发—智能问答系统、企业知识库、AIGC内容生成工具、行业定制化大模型应用
✅项目落地流程—需求拆解、技术选型、模型调优、测试上线、运维迭代
✅面试求职冲刺—岗位JD解析、简历AI项目包装、高频面试题汇总、模拟面经
以上6大模块,看似清晰好上手,实则每个部分都有扎实的核心内容需要吃透!
我把大模型的学习全流程已经整理📚好了!抓住AI时代风口,轻松解锁职业新可能,希望大家都能把握机遇,实现薪资/职业跃迁~
这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)