链表操作:将最大数据节点移至链表末尾的算法实现与详解
解题思路: 首先遍历链表找到数据域值最大的节点以及它的前一个节点。然后修改指针,将最大节点从原来的位置移除,并将其插入到链表的末尾。 以下是算法代码: ```c #include <stdio.h> #include <stdlib.h> // 定义链表节点结构体 struct node { int data; struct node *link; }; // 找到最大节点及其前一个节点的函数 void findMaxAndPrev(struct node *list, struct node maxNode, struct node prevMax) { struct node *cur = list; *maxNode = list; *prevMax = NULL; while (cur!= NULL) { if (cur->data > (*maxNode)->data) { *maxNode = cur; *prevMax = cur == list? NULL : list; while (*prevMax!= NULL && (*prevMax)->link!= cur) { *prevMax = (*prevMax)->link; } } cur = cur->link; } } // 移动最大节点到链表末尾的函数 void moveMaxToEnd(struct node list) { struct node *maxNode, *prevMax; findMaxAndPrev(*list, &maxNode, &prevMax); if (prevMax!= NULL) { prevMax->link = maxNode->link; } else { *list = maxNode->link; } struct node *cur = *list; while (cur->link!= NULL) { cur = cur->link; } cur->link = maxNode; maxNode->link = NULL; } // 打印链表的函数 void printList(struct node *list) { struct node *cur = list; while (cur!= NULL) { printf("%d ", cur->data); cur = cur->link; } printf("\n"); } // 创建链表的函数 struct node *createList(int arr[], int n) { struct node *head = NULL, *tail = NULL; for (int i = 0; i < n; i++) { struct node *newNode = (struct node *)malloc(sizeof(struct node)); newNode->data = arr[i]; newNode->link = NULL; if (head == NULL) { head = newNode; tail = newNode; } else { tail->link = newNode; tail = newNode; } } return head; } // 释放链表内存的函数 void freeList(struct node *list) { struct node *cur = list; struct node *temp; while (cur!= NULL) { temp = cur; cur = cur->link; free(temp); } } int main() { int arr[] = {3, 12, 4, 9, 5, 1}; int n = sizeof(arr) / sizeof(arr[0]); struct node *list = createList(arr, n); printf("原始链表: "); printList(list); moveMaxToEnd(&list); printf("移动后链表: "); printList(list); freeList(list); return 0; } ``` 额外需要注意的逻辑点: 1. 注意内存的分配和释放,避免内存泄漏。 2. 处理链表操作时要小心空指针的情况。 3. 对于复杂的链表操作,建议多进行单元测试以确保代码的正确性。 ######[AI写代码神器 | 834点数解答 | 2025-01-12 21:51:29]
- Python实现Q老师成绩管理任务:修改与查看学生成绩(字节豆包 | 191点数解答 | 2025-12-20 20:55:41)94
- Python 代码助力 Q 老师高效管理班级学生成绩:修改与查看一键搞定(字节豆包 | 326点数解答 | 2025-12-27 20:48:12)103
- Java代码实现从JSON数据中提取ID,涉及“数据”与“项目 - 知识库”结构(字节豆包 | 603点数解答 | 2025-04-15 22:48:51)251
- C++ 实现:计算一排鹅与最高、最矮鹅的身高差及代码详解(字节豆包 | 549点数解答 | 2025-11-16 20:19:06)99
- 编程揭秘:计算 𝑛! 在 𝑃 进制下末尾零个数的方法与代码实现(DeepSeek | 549点数解答 | 2026-01-11 17:49:54)60
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)368
- 深度揭秘 Oracle Workarea Size Policy:参数调优助力数据库性能飞升(阿里通义 | 372点数解答 | 2024-05-13 10:54:45)250
- 微信收款助手监控程序代码剖析:功能、问题与改进方向(DeepSeek | 282点数解答 | 2025-04-11 00:32:28)220
- 高考毕业晚会难题:从学生能力值求最大默契程度的Python解法(字节豆包 | 487点数解答 | 2026-01-24 13:10:18)55
- C#工程师必知:数组、链表、哈希、队列、栈数据结构优缺点大揭秘! (百度文心 | 561点数解答 | 2023-11-09 17:56:30)274
- Java 实现仿 Windows 资源管理器:文件管理器功能全解析与代码示例(字节豆包 | 623点数解答 | 2025-01-01 14:59:04)268
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)338