数据结构——链表逆序详解

ops/2024/11/19 19:36:21/

一、示例

在这里插入图片描述

二、上代码

#include <stdio.h>
#include <stdlib.h>// 定义节点结构体
struct Node {int val;struct Node* next;
};// 定义链表结构体
struct LinkedList {struct Node* head;struct Node* tail;int length;
};// 递归法翻转链表
struct Node* reverseLinkedList(struct Node* head) {// 如果链表为空或只有一个节点,直接返回该节点if (head == NULL || head->next == NULL) {return head;}// 递归翻转链表的其余部分struct Node* newHead = reverseLinkedList(head->next);// 翻转当前节点的指针head->next->next = head;head->next = NULL;// 返回新的头节点return newHead;
}// 辅助函数,用于设置链表的头节点
void setHead(struct LinkedList* list, struct Node* head) {list->head = head;
}int main() {struct LinkedList list;list.head = NULL;list.tail = NULL;list.length = 0;// 创建链表struct Node* node1 = (struct Node*)malloc(sizeof(struct Node));struct Node* node2 = (struct Node*)malloc(sizeof(struct Node));struct Node* node3 = (struct Node*)malloc(sizeof(struct Node));struct Node* node4 = (struct Node*)malloc(sizeof(struct Node));struct Node* node5 = (struct Node*)malloc(sizeof(struct Node));node1->val = 1;node2->val = 2;node3->val = 3;node4->val = 4;node5->val = 5;node1->next = node2;node2->next = node3;node3->next = node4;node4->next = node5;node5->next = NULL;list.head = node1;// 翻转链表struct Node* reversedList = reverseLinkedList(list.head);// 输出翻转后的链表struct Node* current = reversedList;while (current) {printf("%d ", current->val);current = current->next;}printf("\n");return 0;
}

三、详解

以上使用了递归的方法来实现链表的反转,下面是这个递归函数的详细分析:

基本情况:

如果 head 是 null 或者 head.next 是 null,这意味着链表为空或者只有一个节点。在这种情况下,函数直接返回 head,因为不需要进行反转。

递归调用:

如果链表有两个或更多的节点,函数会调用自身来反转从 head.next 开始的子链表。这会得到一个新的头节点 newHead,它是原始链表中除了第一个节点之外的所有节点的反转链表的头节点。
反转当前节点:

在递归调用返回后,head 指向原始链表的第一个节点,而 newHead 指向反转后的子链表的头节点。
head.next.next = head 这行代码将 head 节点的下一个节点的 next 指针指向 head 本身,这实际上是将 head 节点插入到反转后的子链表的头部。
head.next = null 这行代码将 head 节点的 next 指针设置为 null,以完成反转操作。

返回新的头节点:

最后,函数返回 newHead,这是反转后的链表的新头节点。

动态调用过程示例:

假设我们有一个链表:1 -> 2 -> 3 -> 4 -> 5

第一次调用:head 是 1。
因为 head.next 不是 null,所以调用 reverseLinkedList(head.next),即 reverseLinkedList(2)

第二次调用:head 是 2。
因为 head.next 不是 null,所以调用 reverseLinkedList(head.next),即 reverseLinkedList(3)

第三次调用: head 是 3。
因为 head.next 不是 null,所以调用 reverseLinkedList(head.next),即 reverseLinkedList(4)

第四次调用:head 是 4。
因为 head.next 不是 null,所以调用 reverseLinkedList(head.next),即 reverseLinkedList(5)

第五次调用:head 是 5。
因为 head.next 是 null,所以直接返回 head,即 5。

第四次调用返回:newHead 是 5。head 是 4。
head.next.next = head 将 5 的 next 指针指向 4。
head.next = null 将 4 的 next 指针设置为 null。
返回 newHead,即 5。

第三次调用返回:newHead 是 5。head 是 3。
head.next.next = head 将 4 的 next 指针指向 3。
head.next = null 将 3 的 next 指针设置为 null。
返回 newHead,即 5。

第二次调用返回:newHead 是 5。head 是 2。
head.next.next = head 将 3 的 next 指针指向 2。
head.next = null 将 2 的 next 指针设置为 null。
返回 newHead,即 5。

第一次调用返回:newHead 是 5。head 是 1。
head.next.next = head 将 2 的 next 指针指向 1。
head.next = null 将 1 的 next 指针设置为 null。
返回 newHead,即 5。

最终,函数返回 newHead,即反转后的链表的头节点 5,链表变为 5 -> 4 -> 3 -> 2 -> 1。


http://www.ppmy.cn/ops/135053.html

相关文章

多品牌NVR管理工具/设备EasyNVR多个NVR同时管理支持RTSP接入

在当今数字化浪潮席卷全球的背景下&#xff0c;视频监控行业正经历着前所未有的变革。传统的本地录像存储模式正逐步向云端集中管理转型&#xff0c;这一技术的飞跃不仅极大地提升了监控效率与安全性&#xff0c;更为各行各业的智能化管理开辟了新路径。在这一转型过程中&#…

ctf日常

8&#xff0c; [NISACTF 2022]easyssrf 跨目录读取 NSSCTF{c42d6e04-f7cb-4ac4-925b-efd9b90c76ff} 9&#xff0c; [SWPUCTF 2021 新生赛]hardrce <?php header("Content-Type:text/html;charsetutf-8"); error_reporting(0); highlight_file(__FILE__); if(is…

软件可信评估体系

软件可信评估体系 课程&#xff1a;软件质量分析 作业 可编写下面的java程序&#xff1a; package org.example;import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartUtils; import org.jfree.chart.JFreeChart; import org.jfree.chart.axis.NumberAxis; impo…

STM32 创建一个工程文件(寄存器、标准库)

首先到官网下载对应型号的固件包&#xff1a; 像我的STM32F103C8T6的就下载这个&#xff1a; 依次打开&#xff1a; .\STM32F10x_StdPeriph_Lib_V3.5.0\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm 可以看到&#xff1a; 这…

外网访问 WebDav 服务

从外部网络环境&#xff08;比如异地和家中网络&#xff09;来访问公司内网的 WebDav 服务&#xff08;基于 IIS &#xff09;并映射成本地虚拟磁盘。 步骤如下 第一步 在公司内网的电脑上设置 webDav。 1&#xff0c;找到【控制面板】&#xff0c;双击进入。 2&#xff0c…

谷歌Gemini发布iOS版App,live语音聊天免费用!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;专注于分享AI全维度知识&#xff0c;包括但不限于AI科普&#xff0c;AI工…

STM32CUBEIDE FreeRTOS操作教程(九):eventgroup事件标志组

STM32CUBEIDE FreeRTOS操作教程&#xff08;九&#xff09;&#xff1a;eventgroup事件标志组 STM32CUBE开发环境集成了STM32 HAL库进行FreeRTOS配置和开发的组件&#xff0c;不需要用户自己进行FreeRTOS的移植。这里介绍最简化的用户操作类应用教程。以STM32F401RCT6开发板为…

未来汽车新变革,智能表面浮出水面

摘要&#xff1a; 智能表面技术的应用&#xff0c;不仅提升了内饰的美观度&#xff0c;还增强了用户交互的直观性和便捷性。 近年来&#xff0c;智能表面技术在汽车内饰领域的应用标志着智能座舱设计的重大进步。这种技术整合了功能性与智能化&#xff0c;使得座舱内部设计得以…