单向链表反转 如何实现

单向链表反转的实现方法

https://www.zhihu.com/question/441865393/answer/3208578798

单向链表反转是数据结构中的经典问题,在面试和实际开发中经常遇到。以下是 多种实现方式(包括递归和迭代),以 Go 语言为例。


1. 单向链表结构定义

type ListNode struct {Val  intNext *ListNode
}

2. 迭代法(推荐)

思路

  • 使用 三个指针 prevcurrnext,逐个反转节点指向。
  • 时间复杂度 O(n)空间复杂度 O(1)(仅用常量额外空间)。

代码实现

func reverseList(head *ListNode) *ListNode {var prev *ListNode  // 前驱节点curr := head        // 当前节点for curr != nil {next := curr.Next  // 暂存下一个节点curr.Next = prev   // 反转指向prev = curr        // prev 后移curr = next        // curr 后移}return prev  // 返回新头节点
}

示例

输入: 1 -> 2 -> 3 -> nil  
输出: 3 -> 2 -> 1 -> nil

3. 递归法

思路

  • 递归到链表末尾,然后逐层反转指针。
  • 时间复杂度 O(n)空间复杂度 O(n)(递归栈开销)。

代码实现

func reverseList(head *ListNode) *ListNode {if head == nil || head.Next == nil {return head  // 递归终止条件}newHead := reverseList(head.Next)  // 递归到末尾head.Next.Next = head              // 反转指针head.Next = nil                    // 避免循环引用return newHead
}

执行过程

reverseList(1):reverseList(2):reverseList(3): return 32.Next.Next = 2 → 3 -> 22.Next = nil → 3 -> 2 -> nil
1.Next.Next = 1 → 2 -> 1
1.Next = nil → 3 -> 2 -> 1 -> nil

4. 头插法(利用哑节点)

思路

  • 遍历链表,将每个节点插入到 哑节点(Dummy Node) 之后。
  • 时间复杂度 O(n)空间复杂度 O(1)

代码实现

func reverseList(head *ListNode) *ListNode {dummy := &ListNode{}  // 哑节点for head != nil {next := head.Next      // 暂存下一个节点head.Next = dummy.Next // 头插dummy.Next = head      // 更新哑节点指向head = next            // 移动 head}return dummy.Next
}

流程示例

初始: dummy -> nil, 链表: 1 -> 2 -> 3 -> nil第1步: dummy -> 1 -> nil  
第2步: dummy -> 2 -> 1 -> nil  
第3步: dummy -> 3 -> 2 -> 1 -> nil

5. 对比总结

方法时间复杂度空间复杂度适用场景
迭代法O(n)O(1)大多数情况(推荐)
递归法O(n)O(n)代码简洁,但栈溢出风险
头插法O(n)O(1)需要哑节点辅助

6. 测试用例

func printList(head *ListNode) {for head != nil {fmt.Print(head.Val, " -> ")head = head.Next}fmt.Println("nil")
}func main() {head := &ListNode{1, &ListNode{2, &ListNode{3, nil}}}printList(head)          // 1 -> 2 -> 3 -> nilnewHead := reverseList(head)printList(newHead)       // 3 -> 2 -> 1 -> nil
}

7. 常见问题

Q1:递归法的缺点?

  • 链表过长时可能导致 栈溢出(Stack Overflow)。
  • 递归调用有额外空间开销。

Q2:如何优化递归法?

  • 某些编译器支持 尾递归优化(Tail Call Optimization, TCO),但 Go 目前不支持。

Q3:迭代法为什么更推荐?

  • 无栈溢出风险,适合处理超长链表。
  • 空间效率更高(O(1))。

掌握单向链表反转是理解指针操作的基础,建议手写实现并测试边界条件(如空链表、单节点链表)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/88673.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/88673.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php+vue+Laravel音乐媒体播放及周边产品运营平台-nodejs-计算机毕业设计

目录具体实现截图课程项目技术路线开发技术介绍设计思路流程PHP核心代码部分展示详细视频演示/源码获取##项目介绍网络技术的广泛应用显著地推动了生活服务的信息化进程。结合音乐流媒体与周边产品的运营需求,构建一套音乐媒体播放及周边产品运营平台,成…

Python爬虫实战:研究xlwt 和 xlrd 库相关技术

1. 引言 1.1 研究背景与意义 随着电子商务的快速发展,电商平台积累了海量的商品数据。如何从这些数据中提取有价值的信息,为商家提供决策支持,成为电商领域的重要研究方向。传统人工采集和分析数据的方式效率低下,且容易出现错误。自动化数据采集与分析系统能够通过爬虫技…

【QGC】深入解析 QGC 配置管理

引言 在软件开发中,配置管理是一项至关重要的任务,它能帮助我们灵活地管理应用程序的各种参数和设置。QGroundControl(QGC)作为一款强大的开源无人机地面站软件,其配置管理系统设计精巧,值得我们深入学习。…

ChatGPT,从规则到强化学习

要了解 ChatGPT(Chat Generative Pre-training Transformer),我们不得不先看看 NLP 自然语言处理(Natural Language Processing)。因为 ChatGPT 属于 NLP 领域,而 NLP 则又是人工智能的一个分支。 那么什么…

【目标检测之Ultralytics预测框颜色修改】

在 Ultralytics YOLOv8 中修改预测框颜色为红色,以下是三种实用方案:方案 1:直接修改 plot() 方法的 colors 参数 在调用 results.plot() 时直接指定颜色参数: from ultralytics import YOLO# 加载模型 model YOLO("yolov8n…

让 VSCode 调试器像 PyCharm 一样显示 Tensor Shape、变量形状、变量长度、维度信息

文章目录🎯 目标:在 VS Code 调试器中自动显示这些变量信息🔍 原理简介⚠️ 其他方案的局限性❌ 方案一:重写 __repr__❌ 方案二:向 debugpy 注册自定义变量显示器(StrPresentationProvider)✅ …

pip国内镜像源一览

以下是2025年主流pip国内镜像源完整清单及配置指南,综合多个权威来源整理的最新数据:一、核心镜像源推荐(2025年稳定可用)‌阿里云镜像‌https://mirrors.aliyun.com/pypi/simple/优势:依托阿里云CDN,全国平…

当大模型遇见毫米波:用Wi-Fi信号做“透视”的室内语义SLAM实践——从CSI到神经辐射场的端到端开源方案

作者 | Blossom.118 2025-07-12 关键词:CSI-SLAM、神经辐射场、毫米波、Transformer、数字孪生、开源 ---- 1. 为什么要“无摄像头”语义SLAM? • 隐私红线:欧盟GDPR 2024修订版把“摄像头点云”列入高风险生物特征,落地成本高。…

脉冲神经网络膜电位泄漏系数学习:开启时空动态特征提取的新篇章

脉冲神经网络膜电位泄漏系数学习:开启时空动态特征提取的新篇章 摘要 脉冲神经网络(Spiking Neural Networks, SNNs)作为第三代神经网络模型,凭借其事件驱动、高生物逼真度和潜在的超低功耗特性,已成为类脑计算与高效人…

SSRF(ctfshow)

web351-358这部分的题目都是明文的&#xff0c;按照题目要求绕过就行了<?php error_reporting(0); highlight_file(__FILE__); $url$_POST[url]; $xparse_url($url); if($x[scheme]http||$x[scheme]https){ if(!preg_match(/localhost|127\.0\.|\。/i, $url)){ $chcurl_ini…

亚矩阵云手机:重构物流供应链,让跨境包裹“飞”得更快更准

在跨境电商“时效即生命”的竞争中&#xff0c;物流信息滞后、清关效率低下、成本居高不下已成为商家最头疼的“三座大山”。传统模式下&#xff0c;人工更新物流状态耗时易错&#xff0c;跨境包裹常因清关延误遭客户投诉&#xff0c;而高昂的物流成本更直接吞噬利润。亚矩阵云…

HTML(5) 代码规范

HTML(5) 代码规范 引言 HTML(HyperText Markup Language)是一种用于创建网页的标准标记语言。HTML5 作为最新的 HTML 标准,自 2014 年正式发布以来,已经成为了构建现代网页应用的基础。本文将详细介绍 HTML5 代码规范,包括结构、语法、属性以及最佳实践等内容,旨在帮助…

【PTA数据结构 | C语言版】顺序栈的3个操作

本专栏持续输出数据结构题目集&#xff0c;欢迎订阅。 文章目录题目代码题目 请编写程序&#xff0c;将 n1 个整数顺序压入容量为 n 的栈&#xff0c;随后执行 n1 次取顶并出栈的操作。 输入格式&#xff1a; 输入首先在第一行给出正整数 n&#xff08;≤10^4 &#xff09;&a…

使用Pycharm集成开发工具远程调试部署在虚拟机上的flask项目:超级详细的完整指南

本文将详细介绍如何通过PyCharm Professional版远程调试部署在虚拟机(这里以Ubuntu为例)中的Flask项目。这种开发方式特别适合需要在接近生产环境调试的场景。 虚拟机网络配置 这里用到的是VMware的NAT&#xff0c;即网络地址转换模式&#xff0c;要保证你Linux虚拟机的IP&…

UE制作的 AI 交互数字人嵌入到 Vue 开发的信息系统中的方法和步骤

要将 UE(Unreal Engine,虚幻引擎)制作的 AI 交互数字人嵌入到 Vue 开发的信息系统首页中运行,可以参考以下方法步骤以及涉及的软件工具: 准备工作 软件工具 Unreal Engine:用于创建和编辑 AI 交互数字人,需要在 UE 中完成数字人的建模、绑定骨骼、添加 AI 交互逻辑等工…

基于elementUI的el-autocomplete组件的自动补全下拉框实践

<template><div :class"$options.name"><el-autocompletestyle"width: 100%"ref"autocomplete":popper-class"${$options.name}-el-autocomplete"v-model"inputSearchValue":placeholder"输入关键词...…

Gameplay - 独立游戏Celeste的Player源码

TGA2018最佳独立游戏《蔚蓝》的一些公开代码&#xff1b;主要是Player部分的代码&#xff1a;using System; using System.Collections; using System.Collections.Generic; using Monocle; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Input;namespace Cel…

基于大模型的鼻咽癌全周期预测及诊疗优化研究报告

目录 一、引言 1.1 研究背景与意义 1.2 国内外研究现状 1.3 研究目标与创新点 二、大模型技术与鼻咽癌相关理论基础 2.1 大模型技术概述 2.2 鼻咽癌疾病知识 2.3 大模型在医学领域的应用 三、数据收集与预处理 3.1 数据来源 3.2 数据清洗 3.3 数据标注 3.4 数据标…

基于odoo17的设计模式详解---访问模式

大家好&#xff0c;我是你的Odoo技术伙伴。想象一下&#xff0c;我们有一个复杂的对象结构&#xff0c;比如一个由不同类型的订单行&#xff08;销售行、折扣行、备注行&#xff09;组成的销售订单。现在&#xff0c;我们需要对这个结构执行一些新的操作&#xff0c;比如&#…

使用langgraph 构建RAG 智能问答代理

RAG 智能问答代理&#xff1a; ✅ 支持用户持续提问 ✅ 根据模型判断是否需要查资料 ✅ 自动调用 PDF 检索工具查找内容 ✅ 自动引用内容回答 ✅ 可以输入 exit / quit 退出 下载需要的library pip install langchain-google-genai pip install langgraph pip install langchai…