news 2026/9/5 7:09:58

链表与递归实战:反转链表与两两交换节点(LeetCode 206 24)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
链表与递归实战:反转链表与两两交换节点(LeetCode 206 24)

一、递归基础

递归就是函数调用自身。如果一个递归调用是最后一条执行语句,称为尾递归。递归模型由两部分组成:递归出口(结束条件)和递归体(递推关系)。

比如求 n!:

递归出口:fun(1) = 1

递归体:fun(n) = n * fun(n-1)

斐波那契数列也是递归的经典例子:F(0)=0, F(1)=1, F(n)=F(n-1)+F(n-2) (n>=2)。

在链表问题中,递归常常能写出非常简洁的代码,但也要注意理清调用过程。

二、反转链表(LeetCode 206)

题目:给你单链表的头节点 head,请你反转链表,并返回反转后的链表。

方法一:迭代法(双指针)

思路:定义两个指针,cur 指向当前节点,pre 指向前一个节点(初始为 null)。遍历链表,每次把 cur.next 指向 pre,然后 pre 和 cur 同时后移。循环结束返回 pre 即可。

代码:

class Solution:

def reverseList(self, head: ListNode) -> ListNode:

cur = head

pre = None

while cur:

temp = cur.next # 保存下一个节点

cur.next = pre # 反转

pre = cur # pre 后移

cur = temp # cur 后移

return pre

方法二:递归法

思路:假设从节点 head.next 开始后面的链表已经反转完成,那么只需要把 head.next 的 next 指向 head,head.next 设为 null 即可。

代码:

class Solution:

def reverseList(self, head: ListNode) -> ListNode:

if not head or not head.next:

return head

new_head = self.reverseList(head.next)

head.next.next = head

head.next = None

return new_head

三、两两交换链表中的节点(LeetCode 24)

题目:给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。不能修改节点内部的值,只能进行节点交换。

示例:输入 [1,2,3,4],输出 [2,1,4,3]。

思路:使用虚拟头节点 dummy_head,然后用指针 current 遍历。每次需要检查 current.next 和 current.next.next 是否存在。交换时,需要三个临时指针:temp 保存第一个节点,temp1 保存第二个节点的下一个节点。然后调整指针:current.next 指向第二个节点,第二个节点指向第一个节点,第一个节点指向 temp1。最后 current 移动到第一个节点(即交换后的第二个节点)继续循环。

代码:

class Solution:

def swapPairs(self, head: ListNode) -> ListNode:

dummy_head = ListNode(next=head)

current = dummy_head

while current.next and current.next.next:

temp = current.next

temp1 = current.next.next.next

current.next = current.next.next

current.next.next = temp

temp.next = temp1

current = current.next.next

return dummy_head.next

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/5 7:09:29

VFBOX网关实现逆变器Modbus转IEC104接入光伏监控平台

VFBOX网关实现逆变器Modbus转IEC104接入光伏监控平台项目案例做光伏运维这些年,最常遇到的一个坑就是设备数据上不来。尤其是分布式光伏项目,逆变器品牌杂、型号多,通讯协议五花八门,底层采集用的大多是Modbus RTU或者Modbus TCP&…

作者头像 李华
网站建设 2026/9/5 7:09:17

Spring AI详解

可以。你可以把 Spring AI 理解成:Spring Boot 生态里的 AI 应用开发框架,用 Spring 的方式把 LLM、Prompt、RAG、向量数据库、Tool Calling、MCP、Agent 等能力接进 Java 应用。如果你已经熟悉 Spring Boot,那么 Spring AI 是目前比较适合你…

作者头像 李华
网站建设 2026/9/5 7:08:41

WPS2013单元格数字格式设置全解析:从基础到高级应用

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/5 7:08:20

滤波器核心原理与选型指南:从模拟电路到数字降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/5 7:07:35

可重构晶体管介质堆叠工艺:从原理到规模化制造的关键突破

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/5 7:06:46

MATLAB例程工程化实践:从命名解析到开箱即用

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华