现在学生求职,也不太注重算法题了, 不少 面试候选人, 网络,操作系统,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->next
  • second = 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%免费

在这里插入图片描述

Logo

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

更多推荐