反转链表(C语言)

反转链表是一种常见的链表操作,可以通过动态图来说明其过程:

假设有一个包含节点 A -> B -> C -> D -> E 的链表,要将其反转成 E -> D -> C -> B -> A。

  1. 初始状态:

    A -> B -> C -> D -> E
    
  2. 创建指向当前节点和前一节点的指针变量,初始时分别指向 NULL 和 A:

    NULL <- A    B -> C -> D -> E
    
  3. 开始遍历链表,依次反转每个节点的指针方向:

    • 第一步:将当前节点B的 next 指针指向前一节点A,更新指针变量,移动到下一个节点:
      NULL <- A    B    C -> D -> E
      
    • 第二步:将当前节点C的 next 指针指向前一节点B,更新指针变量,移动到下一个节点:
      NULL <- A <- B    C    D -> E
      
    • 依此类推,直到将整个链表都反转为:
      NULL <- A <- B <- C <- D    E
      
  4. 最终链表的状态变为:

    E -> D -> C -> B -> A
    

通过动态图示意反转链表的过程,有助于更直观地理解链表节点指针的修改和移动。希望这样的说明对您有帮助。如果需要进一步解释或有其他问题,请随时告诉我。

#include <stdio.h>
#include <stdlib.h>typedef struct Node {int data;struct Node* next;
} Node, *LinkedList;// 创建一个新节点
Node* createNode(int data) {Node* newNode = (Node*)malloc(sizeof(Node));if (newNode == NULL) {printf("Error! Unable to create a new node.\n");exit(0);}newNode->data = data;newNode->next = NULL;return newNode;
}// 在链表末尾添加新节点
void append(LinkedList* head, int data) {if (*head == NULL) {*head = createNode(data);}else {Node* lastNode = *head;while (lastNode->next != NULL) {lastNode = lastNode->next;}lastNode->next = createNode(data);}
}// 打印链表
void printList(LinkedList head) {while (head != NULL) {printf("%d ", head->data);head = head->next;}printf("\n");
}// 反转链表
LinkedList reverseList(LinkedList head) {Node* prev = NULL;Node* curr = head;while (curr != NULL) {Node* nextTemp = curr->next;curr->next = prev;prev = curr;curr = nextTemp;}return prev;
}int main() {LinkedList head = NULL;append(&head, 1);append(&head, 2);append(&head, 3);append(&head, 4);append(&head, 5);printf("Original List: ");printList(head);head = reverseList(head);printf("Reversed List: ");printList(head);return 0;
}

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

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

相关文章

后端说处理了跨域但没有生效

场景&#xff1a; 常见的跨域报错&#xff0c;一般都是由后端进行setHeader/*什么的。但是现在这种情况就是后端说他们做了处理。但是我这边请求还是报错。 withCredentials: with-credentials用来设置是否发送cookie&#xff0c;如果为true就会在跨域请求时候携带cookie&…

libVLC 提取视频帧

在前面的文章中&#xff0c;我们使用libvlc_media_player_set_hwnd设置了视频的显示的窗口。 libvlc_media_player_set_hwnd(vlc_mediaPlayer, (void *)ui.widgetShow->winId()); 如果我们想要提取每一帧数据&#xff0c;将数据保存到本地&#xff0c;该如何操作呢&#x…

Golang 开发实战day09 - package Scope

&#x1f3c6;个人专栏 &#x1f93a; leetcode &#x1f9d7; Leetcode Prime &#x1f3c7; Golang20天教程 &#x1f6b4;‍♂️ Java问题收集园地 &#x1f334; 成长感悟 欢迎大家观看&#xff0c;不执着于追求顶峰&#xff0c;只享受探索过程 Golang 教程09 - package Sc…

算法练习第12天|● 239. 滑动窗口最大值● 347.前 K 个高频元素

239.滑动窗口的最大值 力扣原题 题目描述&#xff1a; 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1&#xff…

【Nginx 配置详解】:动态文件名设置与正则表达式

Nginx 配置详解&#xff1a;动态文件名设置与正则表达式 Nginx 是一款轻量级的 Web 服务器/反向代理服务器&#xff0c;它的高稳定性、丰富的功能集、简单的配置和低资源消耗使其成为当今最受欢迎的服务器之一。本文将深入探讨 Nginx 配置中的一些关键概念&#xff0c;特别是如…

影响力营销与AI的结合:Kompas.ai在搭桥角色中的独特价值

在数字化营销的新时代&#xff0c;影响力营销已经成为品牌建立信任和提升市场影响力的有效手段。通过与关键意见领袖&#xff08;KOL&#xff09;的合作&#xff0c;品牌能够利用KOL的信誉和影响力来扩大其市场覆盖范围和提升品牌认知度。然而&#xff0c;寻找与品牌价值观相契…

MyBatisPlus入门用法

MyBatisPlus&#xff08;简称MP&#xff09;是MyBatis的增强工具&#xff0c;在MyBatis的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 一、安装 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-start…

python实现网络爬虫

网络爬虫是一个自动从互联网上抓取数据的程序。Python有很多库可以帮助我们实现网络爬虫&#xff0c;其中最常用的是requests&#xff08;用于发送HTTP请求&#xff09;和BeautifulSoup&#xff08;用于解析HTML或XML文档&#xff09;。 以下是一个简单的Python网络爬虫示例&a…

学习【Java IO】这一篇就够了

目录 1. 字节流1-1. InputStream1-2. outputStream 2. 字符流2-1. Reader2-2. Wirter 3. 字节缓冲流3-1. BufferedInputStream&#xff08;字节缓冲输入流&#xff09;3-2. BufferedOutputStream&#xff08;字节缓冲输出流&#xff09; 4. 字符缓冲流5. 打印流6. 随机访问流 1…

Linux 性能分析工具大全

vmstat--虚拟内存统计 vmstat&#xff08;VirtualMeomoryStatistics&#xff0c;虚拟内存统计&#xff09;是 Linux 中监控内存的常用工具,可对操作系统的虚拟内存、进程、CPU 等的整体情况进行监视。vmstat 的常规用法&#xff1a;vmstat interval times 即每隔 interval 秒采…

rsync+inotify实时同步 和 GFS分布式文件系统概述

目录 一、rsyncinotify实时同步 1.1.实时同步的优点 1.2.Linux内核的inotify机制 1.3.发起端配置rsyncInotify 1.4.配置远程登陆 1.4.1.修改rsync源服务器配置192.168.190.101 ​编辑 1.4.2.配置server 192.168.190.102 二、GFS 2.1.GlusterFS简介 2.2.GlusterFS特点…

Flutter学习11 - Future 与 FutureBuilder

1、Future 可以利用 Future 实现异步调用 1.1、Future 的两种形式 自定义一个结果类 class Response {String _data;Response(this._data); }自定义方法实现 Future Future<Response> testFuture() {var random Random();int randomNumber random.nextInt(10);if …

ADB 操作命令及其详细用法

adb devices 用途&#xff1a;列出连接到计算机的所有 Android 设备。详解&#xff1a;执行该命令后&#xff0c;ADB 将扫描连接到计算机的所有 Android 设备&#xff0c;并列出它们的序列号。 adb connect <device> 用途&#xff1a;连接到指定 IP 地址的 Android 设备。…

DIY自己的AI

一、开源AI大语言模型 目前开源的AI大语言模型(LLM)已经非常的多了&#xff0c;以下是收集的一些LLM&#xff1a; LLaMA LLaMA&#xff08;Large Language Model Meta AI&#xff09;&#xff1a;LLaMA是由MetaAI的Facebook人工智能实验室&#xff08;FAIR&#xff09;发布的…

大鼠尾静脉注射仪和小鼠尾静脉注射仪的区别

ZL-02B大鼠可视尾静脉注射仪是用于大鼠尾注射的一款仪器&#xff0c;以往给大鼠注射都是靠盲打&#xff0c;靠经验&#xff0c;对科研新手来说极其困难&#xff0c;有了大鼠尾静脉注射仪&#xff0c;可以大大提高注射效率&#xff0c;该仪器可以显示出尾部血管位置&#xff0c;…

Jenkins 持续集成 【CICD】

持续集成 &#xff08;Continuous integration&#xff0c;简称CI&#xff09; 持续集成是一种开发实践&#xff0c;它倡导团队成员频繁的集成他们的工作&#xff0c;每次集成都通过自动化构建&#xff08;包括编译、构建、打包、部署、自动化测试&#xff09;来验证&#xff…

python中的pass关键字、断言、解包、__name__ =__main__的使用

pass关键字 在Python中&#xff0c;pass是一个空语句&#xff0c;它不做任何操作&#xff0c;只是用来占位或作为占位符使用。在Python中&#xff0c;有时候需要保持语法完整性&#xff0c;但又不需要执行任何操作&#xff0c;这时可以使用pass语句。 以下是pass语句的一些常…

【云开发笔记No.30】弹性MapReduce

弹性MapReduce的定义 弹性MapReduce&#xff08;EMR&#xff09;是一种基于云原生技术和泛Hadoop生态开源技术的安全、低成本、高可靠的开源大数据平台。它结合了云计算的弹性和MapReduce的分布式计算能力&#xff0c;使得大数据处理变得更加高效和灵活。通过EMR&#xff0c;用…

python实现OCR:pytesseract和pyddleocr(附代码)

文章目录 背景pytesseractpaddleocr百度apipaddleocr 背景 OCR是光学字符识别&#xff08;Optical Character Recognition&#xff09;的缩写&#xff0c;通过扫描等光学输入方式和文字识别将图片中的文字提取出来&#xff0c;非常适用于提取网络截图或扫描pdf等文件里的文本。…

鼎盛合方案设计——汽车轮胎气压监测方案

一、介绍 随着汽车的普及和人们对行车安全的日益重视&#xff0c;胎压监测系统&#xff08;TPMS&#xff09;已经成为现代汽车的标准配置之一。传统的胎压监测系统通常采用有线方式&#xff0c;通过传感器和线缆将轮胎的压力信息传输到车辆的控制单元。然而&#xff0c;这种方…