首页 > 其他分享 >11.14

11.14

时间:2024-11-14 23:29:19浏览次数:1  
标签:head ListNode struct 11.14 next 链表 节点

设计文档:链表逆置模块

  1. 问题描述
    本题要求实现一个函数,将给定的单向链表逆置,即表头置为表尾,表尾置为表头。给定链表的节点结构如下:

c
struct ListNode {
int data;
struct ListNode *next;
};
函数接口如下:

c
struct ListNode *reverse(struct ListNode *head);
其中,head 是用户传入的链表的头指针。该函数需要将链表逆置,并返回逆置后的链表头指针。

  1. 函数功能
    函数的核心功能是将单向链表逆置。具体而言:

输入:单向链表的头节点 head。
输出:逆置后的单向链表的头节点。
3. 算法设计
链表逆置的基本思路是通过修改节点的 next 指针来反转链表的方向。

初始化一个 prev 指针,表示已经处理的部分,初始化为 NULL。
遍历链表,每次更新当前节点的 next 指针,使其指向前一个节点。
依次处理链表中的每个节点,直到遍历完链表。
具体步骤:

初始化 prev 为 NULL,curr 为链表的头节点。
遍历链表,对于每个节点:
保存当前节点的下一个节点 next。
将当前节点的 next 指针指向 prev,即反转指向关系。
移动 prev 和 curr 指针向前。
最终,prev 会指向链表的最后一个节点,即新的头节点。
4. 模块图
由于目前不支持插入图片,因此请参考以下文本描述手绘模块图:

+------------------------+
| 输入:链表头节点 head |
+------------------------+
|
V
+------------------------+
| 初始化指针 prev=NULL |
+------------------------+
|
V
+------------------------+
| 遍历链表,更新指针 next |
+------------------------+
|
V
+------------------------+
| 返回反转后的头节点 |
+------------------------+
5. 代码实现
c

include <stdio.h>

include <stdlib.h>

struct ListNode {
int data;
struct ListNode *next;
};

// 反转链表函数
struct ListNode *reverse(struct ListNode *head) {
struct ListNode *prev = NULL, *curr = head, *next = NULL;

// 遍历链表
while (curr != NULL) {
    next = curr->next;  // 保存当前节点的下一个节点
    curr->next = prev;  // 反转当前节点的next指针
    prev = curr;        // prev向后移动
    curr = next;        // curr向后移动
}

return prev;  // 返回新的头节点

}

// 辅助函数:创建链表
struct ListNode *createlist() {
int value;
struct ListNode *head = NULL, *tail = NULL;

// 输入链表数据
while (scanf("%d", &value) && value != -1) {
    struct ListNode *new_node = (struct ListNode *)malloc(sizeof(struct ListNode));
    new_node->data = value;
    new_node->next = NULL;
    
    if (head == NULL) {
        head = new_node;
        tail = new_node;
    } else {
        tail->next = new_node;
        tail = new_node;
    }
}

return head;

}

// 打印链表
void printlist(struct ListNode *head) {
struct ListNode *p = head;
while (p) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}

int main() {
struct ListNode *head;

// 创建链表并逆置
head = createlist();
head = reverse(head);

// 打印逆置后的链表
printlist(head);

return 0;

}
6. 代码解释
reverse 函数:

prev 指针用来记录已反转部分的尾节点。
curr 指针用来遍历链表中的节点。
next 用来保存当前节点的下一个节点,以避免断链。
反转过程中,每次将当前节点的 next 指针指向 prev,然后更新 prev 和 curr。
最终返回的 prev 是反转后的链表头。
createlist 函数:

动态创建链表,直到输入 -1 时停止。
每个新节点通过 malloc 创建,并将其链接到链表的尾部。
printlist 函数:

遍历链表并打印每个节点的数据。
7. 测试样例
输入样例:

1 2 3 4 5 6 -1
输出样例:

6 5 4 3 2 1
8. 时间与空间复杂度
时间复杂度:

由于我们只需要遍历链表一次,时间复杂度为 O(n),其中 n 是链表中的节点数。

空间复杂度:

我们只使用了常数空间存储指针,因此空间复杂度为 O(1)。

  1. 总结
    该函数实现了链表的反转,并通过指针操作实现了高效的反转算法。函数遵循链表的基本操作原则,时间和空间复杂度均为最优解。

标签:head,ListNode,struct,11.14,next,链表,节点
From: https://www.cnblogs.com/hjz20050621/p/18547163

相关文章

  • 2024.11.14
    这段代码是一个SpringSecurity配置类SecurityConfiguration,它主要用于配置SpringSecurity的安全策略,定义了如何处理用户认证、授权、会话管理、跨站请求伪造(CSRF)保护等方面的安全性。下面是对这段代码的逐行解释:1.类定义@Configuration@RequiredArgsConstructorpublic......
  • WLAN学习-11.14
    来源:1.WLAN产品2.capwap工作原理......
  • 冯梓轩2024.11.14模拟赛反思
    冯梓轩2024.11.14模拟赛反思今天算是把之前犯过的大多数错误都犯了一遍。其实主要问题还是出在T1上,当时一直在想能不能先将\(n\)转成三进制数,然后通过后续调整来将其变合法。但是这个思路想了接近3个半小时也不会做。中途我也没有尝试换一种思路,一直按照进制的方式去死磕,最......
  • 2024.11.14 2142版
    起于《海奥华预言》的思考◆地球管理结构和参考持续更新中...... 英文地址:https://github.com/zhuyongzhe/Earth/tags中文地址:https://www.cnblogs.com/zhuyongzhe85作者:朱永哲 ---------------------------------------------------------------------------------......
  • 2024.11.14 2122版
    起于《海奥华预言》的思考◆地球管理结构和参考持续更新中...... 英文地址:https://github.com/zhuyongzhe/Earth/tags中文地址:https://www.cnblogs.com/zhuyongzhe85作者:朱永哲 ---------------------------------------------------------------------------------......
  • 2024.11.14 2105版
    起于《海奥华预言》的思考◆地球管理结构和参考持续更新中...... 英文地址:https://github.com/zhuyongzhe/Earth/tags中文地址:https://www.cnblogs.com/zhuyongzhe85作者:朱永哲 ---------------------------------------------------------------------------------......
  • 2024.11.14 鲜花
    双调排序的正确性证明暨第八交响曲题解推歌:DoubleAgent好多题解都写的或多或少有问题(包括那篇\(30\)分钟速通),终于是整明白了。首先给出双调序列的定义:满足一下条件之一的序列\(\existsk,\foralli<k,a_i>a_{i+1}\land\foralli>k,a_i<a_{i+1}\)即是单谷。其可以通过......
  • 项目冲刺11.14
    这个作业属于哪个课程计科22级34班这个作业要求在哪里作业要求这个作业的目标进行为期七天的项目冲刺并记录前言本篇博客是项目冲刺的第六篇,七篇博客的汇总如下:博客汇总第一篇博客第二篇博客第三篇博客第四篇博客第五篇博客第六篇博客......
  • 2024.11.14随笔&联考总结
    前言今天联考直接炸纲了。但是不得不说:HEZ的题要比BSZX好多了。联考今天联考题说实话难度应该比较适合我。第一题是推结论的题,我赛时20min想出正解,但是有两个细节没有考虑清楚,导致后来调题调了一个多小时,然后经典开警告但是不看秒了,期望得分100pts,实际0pts。原因bool......
  • 2024.11.14 NOIP训练赛
    2024.11.14NOIP训练赛Problem对满足以下条件的01矩阵\(A\)计数:行数为\(n+1\)(从\(0\)至\(n\)标号),列数为\(k\)(从\(1\)至\(k\)标号);不存在使得\(A_{0,i}\simA_{n-1,i}\)这\(n\)个数都为\(1\)的列\(i\);存在使得\(A_{1,i}\simA_{n,i}\)这\(n\)......