【数据结构】设有一带头结点的单链表,编程将链表颠倒过来。要求不用另外的数 组或结点完成。

ops/2024/9/23 18:52:12/

编程题:

设有一带头结点的单链表,编程将链表颠倒过来。要求不用另外的数 组或结点完成。

在这里插入图片描述

分析:
该算法通过维护三个指针(prev、curr 和 next)逐步遍历单链表,实现链表的逆转。在遍历过程中,curr 的 next 指针被更新为指向 prev,逐步反转指向。最终,头结点的 next 指针指向新的头节点(即原链表的尾节点),从而完成链表的逆转。这一过程只需 (O(n)) 的时间复杂度和 (O(1)) 的空间复杂度。

#include <stdio.h>#if 0
typedef int ElemType;typedef struct Lnode {ElemType data; // 数据域struct Lnode* next; // 指针域
} Lnode, * LinkList;// 创建带头结点的单链表
LinkList createList() {LinkList head = (LinkList)malloc(sizeof(Lnode));head->next = NULL;// 这里可以添加其他节点以构造链表return head;
}// 逆转带头结点的单链表
void reverseList(LinkList head) {Lnode* prev = NULL;Lnode* curr = head->next; // 从头结点的下一个开始Lnode* next;while (curr) {next = curr->next; // 保存下一个节点curr->next = prev; // 反转当前节点的指针prev = curr; // 移动 prev 指针curr = next; // 移动 curr 指针}head->next = prev; // 头结点的 next 指向新的头结点
}// 打印链表
void printList(LinkList head) {Lnode* temp = head->next; // 从头结点的下一个开始while (temp) {printf("%d -> ", temp->data);temp = temp->next;}printf("NULL\n");
}int main() {LinkList list = createList();// 添加十个节点到链表for (int i = 1; i <= 10; i++) {Lnode* newNode = (Lnode*)malloc(sizeof(Lnode));newNode->data = i;newNode->next = NULL;Lnode* temp = list; // 找到链表的最后一个节点while (temp->next) {temp = temp->next;}temp->next = newNode; // 将新节点添加到链表末尾}printf("Original List:\n");printList(list);reverseList(list);printf("Reversed List:\n");printList(list);// 释放链表的内存Lnode* temp;while (list->next) {temp = list->next;list->next = temp->next;free(temp);}free(list);return 0;
}#endif

在这里插入图片描述

考试写:

// 逆转带头结点的单链表
void reverseList(LinkList head) {Lnode* prev = NULL;Lnode* curr = head->next; // 从头结点的下一个开始Lnode* next;while (curr) {next = curr->next; // 保存下一个节点curr->next = prev; // 反转当前节点的指针prev = curr; // 移动 prev 指针curr = next; // 移动 curr 指针}head->next = prev; // 头结点的 next 指向新的头结点
}

解法不唯一,欢迎评论区交流。


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

相关文章

docker存储

docker分层结构 如图所示&#xff0c;容器是由最上面可读可写的容器层&#xff0c;以及若干个只读镜像层组成&#xff0c;创建容器时&#xff0c;容器中的 数据都来自镜像层。这样的分层机构最大的特点是写时复制&#xff1a; 1、容器中新生成的数据会直接存放在容器层&#xf…

android MediaPlayer正确使用姿势

android MediaPlayer正确使用姿势!!! mediaplayer在使用时候还好需要注意很多细节&#xff0c;现在很多播放都是推荐使用exoplayer &#xff0c;但是毕竟原生的使用掌握还是很有必要的&#xff0c;为什么mediaplayer使用时候会有很多不顺手地方&#xff1a; MediaPlayer 在不…

ChatGPT 在国内使用的方法

AI如今很强大&#xff0c;聊聊天、写论文、搞翻译、写代码、写文案、审合同等等&#xff0c;ChatGPT 真是无所不能~ 作为一款出色的大语言模型&#xff0c;ChatGPT 实现了人类般的对话交流&#xff0c;最主要是能根据上下文进行互动。 接下来&#xff0c;我将介绍 ChatGPT 在国…

docker容器的172的ip地址,如何与宿主机之外的网络设备通信?

宿主机的地址比如是192.168.1.51 而docker容器比如web1&#xff0c;的ip地址是172.17.0.3 容器如何与外界通信&#xff1f; 通过NAT&#xff0c;网络地址转换 首先&#xff0c;宿主机需要设置 echo net.ipv4.ip_forward 1 >> /etc/sysctl.conf sysctl -p 开启…

计算机网络笔记002

### 课堂讨论对话 **学生A**: 老师&#xff0c;计算机网络的组成是怎样的&#xff1f;&#x1f914; **老师**: 非常好的问题&#xff01;计算机网络主要由硬件、软件和通信协议三部分组成。我们先从硬件开始讨论吧。 **学生B**: 硬件包括哪些设备呢&#xff1f;&#x1f60…

weblogic中间件漏洞复现

后台弱口令getshell 1.开启环境 cd vulhub-master/weblogic/weak_password docker-compose up -d docker ps 2.f访问靶场 访问/console/login/LoginForm.jsp这个目录进行登录&#xff0c; 默认账号密码&#xff1a;weblogic/Oracle123 需要注意的是单个账号进行登录时&…

Flink Task 日志文件隔离

Flink Task 日志文件隔离 任务在启动时会先通过 MdcUtils 启动一个 slf4j 的 MDC 环境&#xff0c;然后将 jobId 添加到 slf4j 的 MDC 容器中&#xff0c;随后任务输出的日志都将附带 joid。 MDC 介绍如下&#xff1a; MDC ( Mapped Diagnostic Contexts )&#xff0c;它是一个…

深度学习基础案例5--VGG16人脸识别(体验学习的痛苦与乐趣)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 这次目标本来要达到60%&#xff0c;但是却非常稳定的达到了40%&#xff0c;​&#x1f622;​​&#x1f622;​​&#x1f622;​​&#x1f622;​&am…