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

【山大909算法题】2014-T1

文章目录

  • 1.原题
  • 2.算法思想
  • 3.关键代码
  • 4.完整代码
  • 5.运行结果

1.原题

为带表头的单链表类Chain编写一个成员函数Reverse,该函数对链表进行逆序操作(将链表中的结点按与原序相反的顺序连接),要求逆序操作就地进行,不分配任何新的结点。要求首先给出类的声明,在类的声明中,其它成员函数省略。

2.算法思想

定义三个指针变量,*prevNode、*currentNode、*nextNode,在遍历过程中反指。对第一个元素和最后一个的元素处理略有不同,需要单独处理。

3.关键代码

/*** @struct ListNode* @brief 单链表中的节点结构。*/
struct ListNode {int data; /**< 节点中存储的数据 */struct ListNode *next; /**< 指向下一个节点的指针 */
};/*** @struct List* @brief 单链表结构。*/
struct List {struct ListNode *head; /**< 指向链表头节点的指针 */int size; /**< 链表的大小 */
};/*** @brief 反转链表中的元素。* @param list 指向 List 结构的指针。*/
void Reverse(struct List *list) {struct ListNode *prevNode = NULL, *currentNode = list->head->next, *nextNode = NULL;while (currentNode != NULL) {nextNode = currentNode->next; // 存储下一个节点currentNode->next = prevNode; // 反转指向前一个节点的指针prevNode = currentNode; // 移动指针以进行下一次迭代currentNode = nextNode;}list->head->next = prevNode; // 更新头指针,使其指向反转后的新的第一个节点
}

4.完整代码

#include <stdio.h>
#include <stdlib.h>/*** @struct ListNode* @brief 单链表中的节点结构。*/
struct ListNode {int data; /**< 节点中存储的数据 */struct ListNode *next; /**< 指向下一个节点的指针 */
};/*** @struct List* @brief 单链表结构。*/
struct List {struct ListNode *head; /**< 指向链表头节点的指针 */int size; /**< 链表的大小 */
};/*** @brief 反转链表中的元素。* @param list 指向 List 结构的指针。*/
void Reverse(struct List *list) {struct ListNode *prevNode = NULL, *currentNode = list->head->next, *nextNode = NULL;while (currentNode != NULL) {nextNode = currentNode->next; // 存储下一个节点currentNode->next = prevNode; // 反转指向前一个节点的指针prevNode = currentNode; // 移动指针以进行下一次迭代currentNode = nextNode;}list->head->next = prevNode; // 更新头指针,使其指向反转后的新的第一个节点
}/*** @brief 显示链表中的元素。* @param list 指向 List 结构的指针。*/
void displayList(struct List *list) {struct ListNode *currentNode = list->head->next;printf("head");while (currentNode != NULL) {printf("->%d", currentNode->data);currentNode = currentNode->next;}printf("->NULL\n");
}int main() {struct List list;list.head = (struct ListNode *) malloc(sizeof(struct ListNode));list.head->next = NULL;list.size = 0;// 插入初始元素 1, 2, 3, 4, 5for (int i = 1; i <= 5; ++i) {struct ListNode *newNode = (struct ListNode *) malloc(sizeof(struct ListNode));newNode->data = i;newNode->next = list.head->next;list.head->next = newNode;list.size++;}// 输出原始链表printf("Original List: ");displayList(&list);// 执行反转操作Reverse(&list);// 输出反转后的链表printf("Reversed List: ");displayList(&list);return 0;
}

5.运行结果

image-20231119220006799
http://www.lryc.cn/news/489519.html

相关文章:

  • 【MySQL实战45讲笔记】基础篇——深入浅出索引(上)
  • 通关C语言自定义类型:联合和枚举
  • python高阶技巧一
  • Java 对象头、Mark Word、monitor与synchronized关联关系以及synchronized锁优化
  • 鸿蒙网络编程系列50-仓颉版TCP回声服务器示例
  • 软件测试基础(自动化测试、性能测试)
  • C++中的原子操作:原子性、内存顺序、性能优化与原子变量赋值
  • 游戏引擎学习第19天
  • RocketMQ: 专业术语以及相关问题解决
  • C++ 类和对象中的 拷贝构造 和 运算符重载
  • el-table最大高度无法滚动
  • Vscode写markdown快速插入python代码
  • 基于 NCD 与优化函数结合的非线性优化 PID 控制
  • 【数据分析】基于GEE实现大津算法提取洞庭湖流域水体
  • 计算机网络安全 —— 报文摘要算法 MD5
  • LeetCode 746. 使用最小花费爬楼梯 java题解
  • Kubernetes的pod控制器
  • ArcMap 处理栅格数据地形图配准操作
  • comprehension
  • 开源宝藏:Smart-Admin 重复提交防护的 AOP 切面实现详解
  • 使用 npm 安装 Electron 作为开发依赖
  • JavaWeb之综合案例
  • MySQL 报错:1137 - Can‘t reopen table
  • Claude3.5-Sonnet和GPT-4o怎么选(附使用链接)
  • 使用itextpdf进行pdf模版填充中文文本时部分字不显示问题
  • java-贪心算法
  • OpenCV和Qt坐标系不一致问题
  • 前端VUE项目启动方式
  • Python小白学习教程从入门到入坑------习题课5(基础巩固)
  • 飞凌嵌入式T113-i开发板RISC-V核的实时应用方案