单链表逆转,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; }

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

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

相关文章

tilelang-docs-l10n

TileLang 文档的本地化&#x1f389; tilelang-docs-l10n 已发布&#xff01; &#x1f680; 预览翻译&#xff1a;https://projects.localizethedocs.org/tilelang-docs-l10n &#x1f310; Crowdin&#xff1a;https://localizethedocs.crowdin.com/tilelang-docs-l10n &a…

Vue 3 从基础到高阶全攻略

Vue 3 从基础到高阶全攻略 探索 Vue 3 的无限可能 &#x1f680; 引言 Vue 3 作为当前最流行的前端框架之一&#xff0c;带来了许多令人振奋的新特性和性能改进。从组合式 API 到更好的 TypeScript 支持&#xff0c;从更小的打包体积到更快的渲染速度&#xff0c;Vue 3 为前端…

25、Linux 操作系统维护指南

Linux 操作系统维护指南 1. 基础管理 Linux 系统的维护和管理可以在多个层面进行。大多数 Linux 安装都会附带 linuxconf 工具,这是一个功能多样的工具,可执行多项管理任务,如设置系统时间、更改网络设置、进行用户管理和设置文件系统等。 此外,Linux 桌面环境提供的工具…

从零开始: C#图像验证码跨平台轻松实现

、验证码原理&#xff1a;不只是“看得清”那么简单验证码实现的完整流程大致如下&#xff1a;验证码生成&#xff1a;当用户请求时&#xff0c;服务器端会生成并像向用户发送一条暗含信息的数据。数据解构&#xff1a;用户收到数据后会对其进行解构并获取可能的真实信息。此时…

20、深入了解 smbclient:实现 Linux 与 Windows 资源交互

深入了解 smbclient:实现 Linux 与 Windows 资源交互 在当今多元化的 IT 环境中,Linux 和 Windows 系统常常需要协同工作,实现资源的共享与交互。smbclient 作为一款强大的客户端工具,为我们提供了便捷的途径来访问 SMB/CIFS 服务器上的资源,其功能类似于传统的 ftp 程序…

Python开发:从基础到实战

目录 第一部分&#xff1a;见道——Python基础与编程思想 第1章&#xff1a;缘起——初识Python与编程世界 1.1 万法皆有源&#xff1a;编程与计算机科学的简史。1.2 为何是Python&#xff1a;Python的哲学——“禅”与“道”。1.3 工欲善其事&#xff1a;搭建你的第一个Pyt…

26、UNIX和Linux系统的安全、卸载及相关资源介绍

UNIX和Linux系统的安全、卸载及相关资源介绍 1. 系统安全 确保计算机系统的安全是至关重要的,但完全杜绝安全漏洞几乎是不可能的。如果想要绝对安全,需要断开网络连接,并且不加载任何支持宏的程序或文档,然而这并不现实。因此,我们需要采取多种措施来提高联网计算机的安…

终极突破:完美解决Vencord中ModView权限限制的完整指南

终极突破&#xff1a;完美解决Vencord中ModView权限限制的完整指南 【免费下载链接】Vencord The cutest Discord client mod 项目地址: https://gitcode.com/GitHub_Trending/ve/Vencord 在Discord社区管理中&#xff0c;ModView功能是管理员查看和管理成员信息的重要工…

RSSPub:RSS聚合器及EPUB生成器

简介 什么是 RSSPub &#xff1f; RSSPub 是一个自托管的 Rust 应用程序&#xff0c;旨在将用户的 RSS/Atom 订阅源转换为个人化的每日新闻报&#xff08;EPUB 格式&#xff09;。该工具自动抓取文章、处理图片&#xff0c;并将所有内容打包成可供 e-reader 或平板电脑阅读的 …

机器视觉与运动控制:基于PC+EtherCAT总线的柔性产线上下料机器人集成案例教程

文章目录摘要1. 系统架构设计1.1 整体技术架构1.2 硬件组成2. 开发环境配置2.1 软件环境搭建2.2 TwinCAT项目配置3. EtherCAT总线配置3.1 从站设备配置3.2 分布式时钟同步4. 机器视觉系统集成4.1 视觉处理算法4.2 视觉-运动控制接口5. 运动控制实现5.1 多轴运动控制算法6. 系统…

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

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

21、深入解析Linux与Windows集成:Samba客户端与服务器配置指南

深入解析Linux与Windows集成:Samba客户端与服务器配置指南 1. smbclient命令与注意事项 在Linux与Windows集成的过程中,smbclient是一个非常重要的工具,它提供了一系列命令来操作服务器上的文件和目录。以下是一些常用命令: - rm <mask> :从服务器的当前工作目…

转录组分析实战:GO与KEGG富集分析原理及R语言实现

. 富集分析基础知识1.1 什么是富集分析&#xff1f;为什么要做富集分析&#xff1f;富集分析&#xff08;Enrichment Analysis&#xff09;是生物信息学中一种重要的分析方法&#xff0c;主要用于识别在特定生物样本&#xff08;如基因集、代谢物集或其他分子集合&#xff09;中…

22、深入了解Samba密码管理与连接状态工具

深入了解Samba密码管理与连接状态工具 1. Samba简介 Samba是一个用于在Linux和Windows系统之间实现文件和打印机共享的开源软件套件。它由Andrew Tridgell创建,现在由Samba团队以类似Linux内核开发的开源方式进行维护和发展。相关的原始手册页由Karl Auer编写,后经Jeremy A…

汇编语言全接触-28.Win32调试API一

在本教程中,我们将学习Win32提供给开发者的用于调试的原语. 在教程的结尾,我们将学习如何调试一个进程. 下载 例子程序.理论:Win32有一些供程序员使用的API,它们提供相当于调试器的功能. 他们被称作Win32调试API(或原语).利用这些API,我们可以:加载一个程序或捆绑到一个正在运行…

番茄红果,字节再造“文化工厂”

“做免费的不如他有钱&#xff0c;有钱的没有他的能力。”“做免费的不如他有钱&#xff0c;有钱的没有他的能力。”短剧行业的人是这么评价红果短剧的。最近&#xff0c;番茄系的收入被曝出&#xff1a;2024年收入突破300亿&#xff0c;其中番茄小说贡献主力&#xff1b;红果短…

14、UNIX/Linux Shell编程实用指南

UNIX/Linux Shell编程实用指南 1. 检测并处理崩溃生成的文件 在程序崩溃时,有时会生成一个名为 core 的文件,这个文件通常很大,往往需要将其删除。下面我们将编写一个脚本,每分钟检查一次主目录中是否生成了 core 文件,如果生成了,就在终端输出警告信息并终止脚本。…

汇编语言全接触-29.Win32调试API二

我们继续Win32调试API的话题。在本章中&#xff0c;我们将要学习如何修改被调试程序。下载 the example 理论:在前面一章中&#xff0c;我们学会了如何装载被调试的进程以及如何处理进程中发生的事件。为了有实际用途&#xff0c;我们的程序应具有修改被调试程序的能力。有好几…

性能检测日志系统

性能日志系统使用文档 文章目录性能日志系统使用文档&#x1f4cb; 概述&#x1f3af; 核心特性1. **模块化日志控制**2. **性能分析工具**3. **高级日志功能**4. **工程化支持**&#x1f4c1; 文件结构&#x1f680; 快速开始1. 基本使用2. 性能分析3. 日志频率控制&#x1f3…

23、全面解析TCP/IP:资源、书籍与网络应用指南

全面解析TCP/IP:资源、书籍与网络应用指南 在当今数字化时代,TCP/IP协议作为互联网通信的基石,其重要性不言而喻。无论是网络开发者、系统管理员,还是对网络技术感兴趣的爱好者,深入了解TCP/IP相关知识都是必不可少的。本文将为大家提供丰富的TCP/IP学习资源,包括相关书…