news 2026/7/19 21:53:12

单链表逆转,c语言

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
单链表逆转,c语言

参考代码随想录的视频:

帮你拿下反转链表 | LeetCode:206.反转链表 | 双指针法 | 递归法_哔哩哔哩_bilibili

题目:

也可参考力扣的这道题目

LCR 024. 反转链表 - 力扣(LeetCode)

#include <stdio.h> #include <stdlib.h> typedef int ElementType; typedef struct Node *PtrToNode; struct Node { ElementType Data; PtrToNode Next; }; typedef PtrToNode List; List Read(); /* 细节在此不表 */ void Print( List L ); /* 细节在此不表 */ List Reverse( List L ); int main() { List L1, L2; L1 = Read(); L2 = Reverse(L1); Print(L1); Print(L2); return 0; } /* 你的代码将被嵌在这里 */

解析一下题目

这里只需要写一下单链表的逆转函数,不需要其他的输入输出函数。

思路:

双指针:

初始化:

给核心指针赋初始值
实现单链表反转的第一步,是定义并初始化三个核心指针,这是整个反转逻辑的起点:

struct Node *prev = NULL; // 前驱指针,初始指向空(反转后链表的尾端默认是空)
struct Node *curr = L; // 当前遍历指针,初始指向原链表的头指针L(从第一个节点开始遍历)
struct Node *next = NULL; // 临时后继指针,初始为空(用来暂存当前节点的下一个节点,避免链表断裂)

这里要先明确,struct Node是链表节点的核心结构体,包含数据域Data和指针域Next,也是我们定义所有链表指针的基础;而L是传入反转函数的原链表头指针,指向原链表第一个有效节点。这三个指针的初始值设定,是为了后续遍历和反转做足准备 —— 前驱指针指向空,保证反转后的链表尾端正确;当前指针从表头开始,确保不遗漏任何节点;临时指针先置空,后续用来保护链表不 “断裂”。

核心:

循环执行中:每一轮的指针调整
初始化完成后,就进入while循环逐节点反转指针,每一轮循环里都会按固定顺序执行 4 步操作,这也是反转的核心环节:
1. 先暂存后继节点:next = curr->Next;
这一步是为了保护链表不丢失后续节点 —— 如果不把当前节点curr的下一个节点地址存到next里,后续修改curr->Next的指向后,原链表的后续节点就会彻底找不到,链表直接 “断链”。
2. 反转当前节点指针:curr->Next = prev;
这是真正完成 “反转” 的关键一步:把当前节点原本指向 “后一个节点” 的指针,改成指向 “前一个节点”(也就是prev),节点的指向方向从 “正向” 变成 “反向”。
3. 前驱指针后移:prev = curr;
prev需要跟在curr后面移动,接手当前节点的地址,为下一个节点的反转做好准备 —— 毕竟下一轮循环,当前节点就会变成 “前驱节点”。
4. 当前指针后移:curr = next;
curr跳到之前暂存的next节点,继续遍历原链表的下一个节点,确保所有节点都能被反转。
举个例子,假如原链表是1→3→4→5→2→NULL,第一轮循环会把1的Next指向NULL,第二轮把3的Next指向1,第三轮把4的Next指向3…… 每一轮循环都在调整一个节点的指向,链表的反转就是这样一步步完成的。
结束循环的条件:curr == NULL
整个循环的执行条件是while (curr != NULL),简单说就是:只要curr指向有效节点(不是空),就会继续反转;当curr变成NULL时,循环就会终止。
循环终止时的指针状态很关键:此时curr已经走到原链表最后一个节点的 “下一个位置”(也就是空指针的位置),不再指向任何有效节点;而prev会停在原链表的最后一个有效节点上(比如上面例子里的2),这个节点正好是反转后链表的第一个节点。

返回值:返回 prev 指针
循环结束后,反转函数最终要返回prev指针 —— 因为此时prev指向的是反转后链表的头节点,而curr和next都是 NULL,只有prev能代表反转后的完整链表。
还是拿刚才的例子来说,循环结束后prev指向节点2,返回这个指针后,我们就能得到2→5→4→3→1→NULL的反转链表,完全符合单链表反转的需求。
最后总结一下整个逻辑:从原链表头开始,用临时指针保护后续节点不丢失,逐个反转当前节点的指向,直到遍历完所有节点(curr 变为 NULL),最后返回此时的 prev 指针,就是反转后链表的头节点。整个过程的核心是指针的有序调整,只要理清每一步指针的指向变化,单链表反转就很好理解了。

手写笔记

手写笔记

递归:

待拓展,敬请期待

答案:

注意:NULL大写,Next大写,以及中英文的指针,PtrToNodestruct Node *

这里是pta的答案

List Reverse( List L ){ // PtrToNode 这个就是 struct Node; // 初始化,注意大小写 PtrToNode pre=NULL; PtrToNode cur=L;//L是头指针 PtrToNode temp=NULL; // while括号中是循环能够进行的条件 while(cur){ temp=cur->Next; cur->Next=pre; pre=cur; cur=temp; } return pre; }

这里是力扣,c语言版的答案

/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ struct ListNode* reverseList(struct ListNode* head){ struct ListNode* cur=head; struct ListNode* pre=NULL; struct ListNode* temp=NULL; while(cur){ temp=cur->next; cur->next=pre; pre=cur; cur=temp; } return pre; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/14 12:10:55

minio分片上传

minio分片上传前言分片上传的技术选择实现分片上传第一步自定义客户端初始化分片上传获取一个上传分片的url共前端使用确认每一个分片的上传合并分片文件前言 为什么要选择将一个大文件拆分成许多小文件来上传&#xff1f; 对于许多服务器和应用框架来说&#xff0c;单次HTTP…

作者头像 李华
网站建设 2026/7/19 12:46:47

基于MATLAB实现深度学习图像分类

一、环境配置与数据准备 1.1 环境要求 MATLAB版本&#xff1a;R2021a及以上&#xff08;需安装Deep Learning Toolbox&#xff09;GPU支持&#xff1a;推荐NVIDIA CUDA兼容显卡&#xff08;通过gpuDevice验证&#xff09; 1.2 数据组织结构 dataset/ ├── train/ │ ├──…

作者头像 李华
网站建设 2026/7/19 19:38:09

9、UNIX/Linux 文件操作全解析

UNIX/Linux 文件操作全解析 1. 文件内容的初步探索 当你尝试使用 cat 命令查看文件内容时,可能会遇到权限问题,例如: $ cat myfile cat: myfile: Permission denied若已知文件存在,我们自然会想知道它的内容。虽然文件本质是字节序列,但我们更关心这些字节代表什么。…

作者头像 李华
网站建设 2026/7/18 18:59:50

企业SRC支付漏洞EDUSRC众测挖掘思路技巧操作分享

0x1 前言这篇文章也是给师傅们分享几个SRC漏洞挖掘中的技巧点&#xff0c;两个企业SRC漏洞案例&#xff0c;支付漏洞中&#xff0c;师傅们碰到都可以进行尝试验证下&#xff0c;要是挖到了&#xff0c;像众测中就是中、高危起步了。赏金的价格还不错&#xff0c;两个案例也写的…

作者头像 李华
网站建设 2026/7/17 6:10:26

webpack输出代码报错到指定文本文件

文章目录 概述代码 概述 在vscode的控制台输出的报错是有限的&#xff0c;多了就看不全了。想要看全部代码报错&#xff0c;就产生了如下方式&#xff1a; 代码 // 在package.json的scripts下&#xff0c;增加以下配置&#xff1a; start2: "set NO_COLOR1 && …

作者头像 李华
网站建设 2026/7/17 17:27:53

自然语言处理容易混淆知识点(二)BERT和BERTopic的区别

BERT和BERTopicBERT&#xff08;深度学习模型&#xff09;BERTopic&#xff08;主题建模工具包&#xff09;关系类比详细对比1. BERT&#xff1a;基础组件2. BERTopic&#xff1a;完整系统技术架构图关键区别表格实际代码对比**只用 BERT**使用 BERTopic常见混淆点澄清1. 名字为…

作者头像 李华