当前位置: 首页 > news >正文

LeetCode 24反转链表

单链表反转:详细解析与代码实现

在数据结构的学习过程中,链表是一个非常重要且有趣的部分,而单链表的反转操作更是常考的基础知识点。今天就来和大家详细讲讲如何实现单链表的反转,并通过代码示例来加深理解呀。

题目

给定单链表的头节点 head ,请反转链表,并返回反转后的链表的头节点。

思路分析

要反转单链表,核心思路就是改变链表节点中指针的指向方向。我们可以想象成把原来依次相连的节点,逐个 “掉头”,让它们按照相反的顺序重新连接起来。

为了实现这个过程,我们采用迭代的方法,借助几个指针来帮忙操作:

  1. prev 指针:这个指针一开始初始化为 NULL,它的作用是始终指向当前节点的前一个节点。在反转的过程中,它相当于一个 “锚点”,让当前节点能够指向它,从而改变链表的连接方向。
  2. curr 指针:初始化为链表的头节点 head,它代表着我们当前正在处理的节点。在每一轮循环中,我们都会对这个节点进行操作,改变它的 next 指针指向。
  3. nextTemp 指针:它用于临时保存当前节点的下一个节点。为什么要这么做呢?因为一旦我们改变了当前节点 curr 的 next 指针指向(让它指向 prev),如果不提前保存下一个节点的信息,那就会丢失后续链表的连接情况,导致链表断裂呀。

整个反转过程就是通过不断地循环,在每一轮循环中完成以下几个关键步骤:

  • 首先,使用 nextTemp 保存 curr 节点的下一个节点,也就是执行 nextTemp = curr->next; 这一步,确保后续链表不会丢失。
  • 接着,把当前节点 curr 的 next 指针指向它前面的节点 prev,即 curr->next = prev;,这一步就是真正改变链表连接方向,实现 “反转” 的关键操作哦。
  • 然后,更新 prev 指针,让它指向当前节点 curr,执行 prev = curr;,为下一轮循环做准备,因为下一轮循环中,当前节点就变成了之前保存的 nextTemp 所指向的节点了,而此时的 prev 就要相应跟上呀。
  • 最后,更新 curr 指针,让它指向之前保存的下一个节点 nextTemp,也就是 curr = nextTemp;,这样就可以进入下一轮循环,继续处理链表中的下一个节点啦。

当循环结束,也就是 curr 遍历到原链表的末尾(即 curr 变为 NULL)时,prev 指针就正好指向了反转后链表的头节点啦,我们最后返回这个 prev 就大功告成咯。

代码实现

下面就是使用 C 语言实现单链表反转的完整代码啦:

#include <stdio.h>
#include <stdlib.h>// 单链表节点结构体定义
/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
struct ListNode {int val;struct ListNode *next;
};// 创建单链表节点的函数
struct ListNode* createNode(int val) {struct ListNode* newNode = (struct ListNode*)malloc(sizeof(struct ListNode));if (newNode == NULL) {printf("内存分配失败!\n");return NULL;}newNode->val = val;newNode->next = NULL;return newNode;
}// 向链表末尾插入节点的函数
void insertNode(struct ListNode** head, int val) {struct ListNode* newNode = createNode(val);if (*head == NULL) {*head = newNode;} else {struct ListNode* temp = *head;while (temp->next!= NULL) {temp = temp->next;}temp->next = newNode;}
}// 打印单链表的函数
void printList(struct ListNode* head) {struct ListNode* temp = head;while (temp!= NULL) {printf("%d ", temp->val);temp = temp->next;}printf("\n");
}// 反转单链表的函数
struct ListNode* reverseList(struct ListNode* head) {if (head == NULL) {return head;}struct ListNode *prev = NULL;struct ListNode *curr = head;struct ListNode *nextTemp;while (curr!= NULL) {nextTemp = curr->next;curr->next = prev;prev = curr;curr = nextTemp;}return prev;
}int main() {struct ListNode* head = NULL;// 构建一个简单的单链表,例如1 -> 2 -> 3 -> 4 -> 5insertNode(&head, 1);insertNode(&head, 2);insertNode(&head, 3);insertNode(&head, 4);insertNode(&head, 5);printf("原单链表为: ");printList(head);struct ListNode* reversedHead = reverseList(head);printf("反转后的单链表为: ");printList(reversedHead);return 0;
}

 

相关文章:

LeetCode 24反转链表

单链表反转&#xff1a;详细解析与代码实现 在数据结构的学习过程中&#xff0c;链表是一个非常重要且有趣的部分&#xff0c;而单链表的反转操作更是常考的基础知识点。今天就来和大家详细讲讲如何实现单链表的反转&#xff0c;并通过代码示例来加深理解呀。 题目 给定单链…...

用python的flask写的一个MQTT中转功能,http的方式发送数据和接收数据

需求背景 给一个客户对接人脸识别的设备&#xff0c;最后需要通知服务端进行一些消息推送。 简单例子 # 作者 陈老师 # https://v.iiar.cn import json import paho.mqtt.client as mqtt import requests from flask import Flask, requestapp Flask(__name__)# MQTT配置 mq…...

img引入svg如何修改颜色

方法1&#xff1a;通过css中filter:drop-shadow 首先需要一个容纳图标的父盒子(下方实例中的.svg-img)&#xff0c;通过css造一个图标的‘影子’&#xff08;.svg-color中的drop-shadow&#xff09;&#xff0c;然后设置‘影子’的颜色&#xff0c;再把图标本体移出父盒子&…...

计算机毕业设计PySpark+PyFlink+Hive地震预测系统 地震数据分析可视化 地震爬虫 大数据毕业设计 Hadoop 机器学习 深度学习

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

【Python】使用Numpy实现余弦相似度计算

本文详细介绍了如何使用 NumPy 实现两个向量之间的余弦相似度计算&#xff0c;帮助理解向量相似度在推荐系统、文本处理等领域的应用。 1. 余弦相似度定义 余弦相似度是衡量两个向量在高维空间中夹角大小的指标&#xff0c;其公式为&#xff1a; c o s ( θ ) A ⋅ B ∥ A ∥…...

nginx中的root和alias的区别

alias 在E:\\test\\目录下创建一个index.html文件 在nginx.conf文件配置alias,路径填写为绝对路径&#xff0c;但是要注意&#xff0c;这里结尾是文件夹的名字 然后下面的/aa/ 是随便起的名字&#xff0c;也不是文件夹的名字&#xff0c;在浏览器访问的使用的 在浏览器使用 …...

探索Telnet:实现Windows远程登录Ubuntu的实践指南

前言 在互联网技术日新月异的今天&#xff0c;远程登录已经成为许多开发者和系统管理员日常工作中不可或缺的一部分。虽然SSH已经成为远程登录的首选协议&#xff0c;但了解并掌握Telnet这一经典协议仍然具有重要意义。本文将带您一起探索如何使用Telnet实现Windows远程登录Ub…...

在 Vue 2 中隐藏页面元素的方法

目录 在 Vue 2 中隐藏页面元素的方法 引言 1. 使用 v-if 指令 2. 使用 v-show 指令 3. 使用自定义类名与 v-bind:class 4. 使用内联样式与 v-bind:style 5. 使用组件的 keep-alive 和条件渲染 在 Vue 2 中隐藏页面元素的方法 引言 在开发 Web 应用时&#xff0c;我们经…...

【Java】Java8的4个函数式接口简单教程

什么是函数是接口&#xff1f; 函数式接口是一个包含 单个抽象方法 的接口&#xff0c;且可以有任意多个默认方法或静态方法。为了增强可读性&#xff0c;Java 8 引入了 FunctionalInterface 注解&#xff0c;用于标识该接口是一个函数式接口&#xff0c;编译器会帮助我们检查…...

计算机组成原理与系统结构——微程序控制

笔记内容及图片整理自XJTUSE “计算机组成原理与系统结构” 课程ppt&#xff0c;仅供学习交流使用&#xff0c;谢谢。 基本概念 微指令 将控制单元实现为基本逻辑单元之间的互连并非易事&#xff0c;且设计相对呆板&#xff0c;难以灵活地改变&#xff0c;因此实现微程序控制…...

【Swift】集合类型 - 数组、集合、字典

文章目录 集合的可变性数组数组类型简写语法创建空数组使用默认值创建数组通过合并两个数组创建一个新数组使用数组字面量创建数组访问和修改数组 Swift 提供了三种主要的 集合类型&#xff0c;分别是数组、集合和字典&#xff0c;用于存储值集合。数组是有序的值集合。集合是无…...

3D 视觉定位技术:汽车零部件制造的智能变革引擎

在汽车零部件制造领域&#xff0c;传统工艺正面临着前所未有的挑战。市场对于零部件精度与生产效率近乎苛刻的要求&#xff0c;促使企业寻求突破之道。而 3D 视觉定位技术&#xff0c;为汽车零部件制造开启了精准定位与智能化生产的新纪元。 3D 视觉定位系统的核心技术原理 3…...

操作系统的基本认识

操作系统的感性认识 操作系统这个词可能或多或少听说过&#xff0c;比如windows, linux, macOS。这些其实都是工程师们经过实践后的具象化产物。而操作系统原理这六个字就是操作系统的抽象化&#xff0c;更准确的说&#xff0c;操作系统原理是很理论化的东西。举一个不是很恰当…...

使用pycharm连接远程服务器

使用pycharm连接远程服务器 1.在你的项目里配置 SSH &#xff0c;放到服务器上去跑 主机为服务器的IP地址&#xff0c;输入用户名和密码 配置项目位置、选择编译器 2.设置本地更改代码保存后即上传到服务器 在本地使用 pycharm 调试代码&#xff0c;pycharm 上面的代码更改…...

【Linux SH脚本】LinuxCheck 应急检查信息脚本

LinuxCheck 1.下载地址 【Linux SH脚本】LinuxCheck 应急检查信息脚本 2.简介 LinuxCheck 是一个开源的自动化检查脚本&#xff0c;旨在快速检测 Linux 系统的安全配置和潜在问题。它支持多种发行版&#xff0c;能够扫描并生成详细的报告&#xff0c;涵盖用户管理、权限配置…...

apifox创建一个mock接口

1、新建接口 2、选择mock&#xff0c;开启云端mock&#xff1b; 3、新建期望&#xff1b; 4、编辑响应体&#xff1b; 5、快速请求&#xff0c;测试&#xff1b; &#xff08;主要可能是网络问题&#xff0c;也可以自己python mock一个&#xff1b;apifox简单快速&#xf…...

设计一个基础JWT的多开发语言分布式电商系统

在设计一个分布式电商系统时&#xff0c;保证系统的可扩展性、性能以及跨语言的兼容性是至关重要的。随着微服务架构的流行&#xff0c;越来越多的电商系统需要在多个服务间共享信息&#xff0c;并且保证服务的安全性。在这样的场景下&#xff0c;JSON Web Token&#xff08;JW…...

委托(Delegate)与事件(Event)-(上篇)

C#中的委托&#xff08;Delegate&#xff09;是一种类型安全的函数指针&#xff0c;它允许将方法作为参数传递给其他方法&#xff0c;并且可以用来实现回调机制。委托是C#中实现事件处理、异步编程以及面向对象设计模式的重要工具之一。在C#中&#xff0c;委托被定义为引用类型…...

Scala根据身份证前两位数判断地区

方法一 val id "339005200101010928"// 取出id前两位 val province id.substring(0, 2) /*//println(province)if (province "42") {println("湖北")}else if (province "11") {println("北京")}else if (province &qu…...

freeswitch(开启支持视频H264通话)

亲测版本centos 7.9系统–》 freeswitch1.10.9 本人freeswitch安装路径(根据自己的路径进入) /usr/local/freeswitch/etc/freeswitch场景介绍: 内部默认是不支持的,视频通话,需要开启模块使用方法: 第一步:进入vars.xml 下面找到global_codec_prefs和outbound_codec_pr…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

CSS | transition 和 transform的用处和区别

省流总结&#xff1a; transform用于变换/变形&#xff0c;transition是动画控制器 transform 用来对元素进行变形&#xff0c;常见的操作如下&#xff0c;它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器

一、原理介绍 传统滑模观测器采用如下结构&#xff1a; 传统SMO中LPF会带来相位延迟和幅值衰减&#xff0c;并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF)&#xff0c;可以去除高次谐波&#xff0c;并且不用相位补偿就可以获得一个误差较小的转子位…...

从物理机到云原生:全面解析计算虚拟化技术的演进与应用

前言&#xff1a;我的虚拟化技术探索之旅 我最早接触"虚拟机"的概念是从Java开始的——JVM&#xff08;Java Virtual Machine&#xff09;让"一次编写&#xff0c;到处运行"成为可能。这个软件层面的虚拟化让我着迷&#xff0c;但直到后来接触VMware和Doc…...