news 2026/6/22 23:05:46

单链表逆转

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
单链表逆转

一、题目要求

1.1 需求与接口

实现函数List Reverse( List L ),输入单链表头指针L,返回逆转后的链表头指针。

1.2 数据结构定义

typedef int ElementType; typedef struct Node *PtrToNode; struct Node { // 节点结构:数据域+指针域 ElementType Data; PtrToNode Next; }; typedef PtrToNode List; // List等价于指向节点的指针,代表链表头指针

1.3 输入输出样例

  • 输入:5 1 3 4 5 2(5 为节点个数,后续数字为各节点数据)
  • 输出:1(原链表头节点);2 5 4 3 1(逆转后的链表)

二、题目分析

2.1 链表结构

题目中链表为不带头节点类型,即头指针L直接指向第一个数据节点,节点间通过Next指针串联,末尾节点的NextNULL

以输入样例为例,链表结构可视化:L → 节点1(Data=1, Next→3) → 节点3(Data=3, Next→4) → 节点4→节点5→节点2→NULL

2.2 解题思路

单链表逆转的本质是重新调整节点指针的指向,将每个节点的Next指针从 “指向下一个节点” 改为 “指向前一个节点”。常用两种实现思路:

  1. 迭代法(头插法):逐个摘下原链表的节点,将其插入到新链表的头部,最终新链表即为逆转结果。
  2. 递归法:采用分治思想,先递归逆转当前节点之后的子链表,再调整当前节点与子链表的指针关系。

三、答案及解析

3.1 迭代法(推荐)

List Reverse( List L ){ List p, q; // p为遍历指针,q暂存p的后继节点(防止断链) List newHead = NULL; // 逆转链表的头指针(核心变量) p = L; // 从原链表第一个节点开始遍历 while(p != NULL){ q = p->Next; // 1. 保存p的后继,避免后续操作丢失原链表后续节点 p->Next = newHead; // 2. 将p节点挂到逆转链表的头部 newHead = p; // 3. 更新逆转链表的头指针为p p = q; // 4. p移动到下一个待处理节点 } return newHead; // 返回逆转后的链表头指针 }
解析
  1. 变量

    • newHead:始终指向已完成逆转的链表部分的头节点,初始值为NULL(表示逆转链表为空),是整个算法的核心锚点。
    • q:用于暂存p的后继节点,因为修改p->Next后会丢失原链表的后续节点,必须提前保存。
    • p:遍历原链表的指针,逐个处理每个节点。
  2. newHead 的完整变化流程

  3. 以输入样例1→3→4→5→2为例,将newHead的变化与逆转链表状态对应,清晰展示每一步操作:

    处理节点newHead 初始值p->Next = newHead(连接)newHead = p(更新)逆转链表状态newHead 的含义
    无(初始)NULL--逆转链表为空
    节点 1NULL节点 1→Next = NULLnewHead→节点 11→NULL逆转链表的头是节点 1
    节点 3节点 1节点 3→Next = 节点 1newHead→节点 33→1→NULL逆转链表的头是节点 3
    节点 4节点 3节点 4→Next = 节点 3newHead→节点 44→3→1→NULL逆转链表的头是节点 4
    节点 5节点 4节点 5→Next = 节点 4newHead→节点 55→4→3→1→NULL逆转链表的头是节点 5
    节点 2节点 5节点 2→Next = 节点 5newHead→节点 22→5→4→3→1→NULL逆转链表的头是节点 2
  4. 终止与返回p=NULL时,说明原链表遍历完成,此时newHead指向原链表的最后一个节点(样例中为节点 2),也就是逆转后链表的头节点,返回newHead即可完成逆转。

3.2 递归法

List Reverse( List L ){ // 终止条件:空链表或只有一个节点的链表,无需逆转直接返回 if (L == NULL || L->Next == NULL) return L; // 1. 递归逆转子链表(处理L->Next开始的部分) List newList = Reverse(L->Next); // 2. 调整当前节点与子链表的指针关系 L->Next->Next = L; // 子链表的末尾节点指向当前节点L L->Next = NULL; // 切断L与原后继的联系,防止链表成环 // 3. 返回逆转后的总链表头(始终是原链表的末尾节点) return newList; }
解析
  1. 终止条件当链表为空(L=NULL)或只有一个节点(L->Next=NULL)时,无需逆转,直接返回L,这是递归的出口,避免无限递归。

  2. 递归核心以样例链表1→3→4→5→2为例:

    • 调用Reverse(L)时,会先递归调用Reverse(3)Reverse(3)又调用Reverse(4),直到Reverse(2)触发终止条件,返回节点 2(newList=2)。
    • 从最深层递归返回,依次调整每个节点的指针。
  3. 指针调整

    • 当回溯到Reverse(5)时:L=5L->Next=2,执行L->Next->Next = L2->Next=5,再执行L->Next=NULL5->Next=NULL,此时子链表为2→5→NULL,返回newList=2
    • 继续回溯,依次调整节点 4、3、1 的指针,最终得到逆转链表2→5→4→3→1→NULL
  4. 返回值递归过程中,newList始终指向原链表的末尾节点(逆转后的头节点),最终返回该节点即可。

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

果六郎济南直营二店开业:一场鲜果的甜蜜邂逅

在济南这座充满活力与温情的城市里,生活的每一处角落都散发着独特的魅力。而在12月16日这一天,历城区新城香溢紫郡16号楼2 - 131处,伴随着鞭炮声,盛大的舞狮表演,剪彩仪式的进行,主持人激情的介绍&#xff…

作者头像 李华
网站建设 2026/6/23 12:01:25

Java面试Redis核心知识点整理!

大家都知道Redis的业务范围是非常广的,但是对于刚入行的小伙伴来说可能也就知道个缓存跟分布式锁。因为Redis的很多功能在一些小企业里,根本是用不到的,得等到并发量到了一定的程度,系统扛不住了,才会用到Redis那些高级…

作者头像 李华
网站建设 2026/6/23 20:40:15

9、数据足迹缩减:存储容量优化策略

数据足迹缩减:存储容量优化策略 1. 数据足迹缩减技术概述 在当今数字化时代,网络速度加快、存储容量增大,但在特定时间和预算内,需要移动、处理和存储的信息也更多。数据足迹缩减(DFR)技术应运而生,其重要性在于提高资源利用效率,满足服务需求。常见的DFR技术和方法包…

作者头像 李华
网站建设 2026/6/22 18:18:51

17、IT 领域的技术解析与服务洞察

IT 领域的技术解析与服务洞察 在当今数字化时代,数据的生成、处理和存储量达到了前所未有的高度。即使在经济危机期间,对数据处理、移动和存储的需求也在持续增长。因此,IT 组织需要在不增加成本和不影响服务交付的前提下,利用现有资源支持业务增长并提供新服务。以下将为…

作者头像 李华
网站建设 2026/6/23 10:27:34

卡顿监测原理

卡顿监测的核心是检测主线程是否被长时间阻塞,导致无法及时更新 UI。卡顿的本质帧率与刷新率iOS 屏幕刷新率:60Hz(ProMotion 120Hz)每帧理论时间:16.67ms(60Hz)或 8.33ms(120Hz&…

作者头像 李华
网站建设 2026/6/23 20:42:13

[创业之路-733]:CTO - 技术视野、商业理解力、领导力、团队间协作与沟通、团队管理:“技术的战略家 + 商业的合伙人 + 团队的教练”

作为首席技术官(CTO),其角色远不止技术专家,更是连接技术、商业与组织战略的关键枢纽。以下是针对CTO核心能力的详细解析:技术视野(Technical Vision)前瞻性判断:能够洞察行业技术趋…

作者头像 李华