单链表应用:双指针【快慢指针】
[2019] 15 分已知一个带有表头节点的单链表节点结构为datalink假设该链表只给出了头指针list。在不改变链表的前提下请设计一个尽可能高效的算法查找链表中倒数第k个位置上的结点k为正整数。若查找成功算法输出该节点的data域的值并返回 1否则只返回 0。要求1描述算法的基本思想2描述算法的详细实现步骤3根据设计思想和实现步骤采用程序设计语言描述算法使用 C、C、或 Java 语言实现关键之处请给出简要注释。1算法基本思想采用双指针快慢指针法在不改变链表结构、仅遍历一次链表的前提下高效找到倒数第 k 个结点定义两个指针fast和slow初始均指向表头节点。先让fast指针向前移动k步使两指针之间保持k个结点的距离。之后fast和slow同时向后移动当fast到达链表末尾时slow恰好指向倒数第 k 个结点。若fast在移动 k 步的过程中提前到达末尾说明 k 值超过链表长度查找失败。2详细实现步骤初始化定义指针fast、slow均指向链表头节点list。前向移动 k 步循环移动fast指针共 k 次若循环中fast变为NULL说明 k 大于链表长度返回 0。同步移动当fast不为空时fast和slow同时向后移动直到fast指向链表尾节点的下一个位置NULL。结果处理此时slow指向倒数第 k 个结点输出其data域值返回 1若步骤 2 中提前结束返回 0。3C 语言实现代码核心代码// 链表结点结构定义需在函数外声明 typedef struct Node { int data; struct Node *link; } Node; // 核心函数查找单链表倒数第k个结点 // 参数list-链表头指针k-倒数第k个位置 // 返回查找成功返回1失败返回0成功时输出目标结点data值 int findKthFromEnd(Node *list, int k) { // 1. 边界条件校验空链表、k非正均直接失败 if (list NULL || k 0) return 0; // 2. 初始化快慢指针 Node *fast list, *slow list; // 3. 快指针先移动k步判断k是否超出链表长度 for (int i 0; i k; i) { if (fast NULL) return 0; // k超过链表长度返回失败 fast fast-link; } // 4. 快慢指针同步移动直到快指针到链表末尾 while (fast ! NULL) { fast fast-link; slow slow-link; } // 5. 找到目标结点输出data并返回成功 printf(%d\n, slow-data); return 1; }完整代码#include stdio.h #include stdlib.h // 定义链表结点结构 typedef struct Node { int data; struct Node *link; } Node; // 查找倒数第k个结点的算法 int findKthFromEnd(Node *list, int k) { if (list NULL || k 0) { // 空链表或k不合法 return 0; } Node *fast list; Node *slow list; // fast指针先移动k步 for (int i 0; i k; i) { if (fast NULL) { // k超过链表长度 return 0; } fast fast-link; } // 同步移动fast和slow直到fast到达末尾 while (fast ! NULL) { fast fast-link; slow slow-link; } // slow指向倒数第k个结点输出data并返回1 printf(%d\n, slow-data); return 1; } // 辅助函数创建新结点 Node* createNode(int data) { Node *newNode (Node*)malloc(sizeof(Node)); newNode-data data; newNode-link NULL; return newNode; } // 辅助函数尾插法构建链表 void append(Node *head, int data) { Node *cur head; while (cur-link ! NULL) { cur cur-link; } cur-link createNode(data); } // 测试主函数 int main() { // 创建带头节点的链表 Node *list createNode(0); // 表头节点data无实际意义 append(list, 1); append(list, 2); append(list, 3); append(list, 4); append(list, 5); int k 2; int res findKthFromEnd(list, k); printf(返回值: %d\n, res); // 预期输出4返回1 return 0; }算法分析时间复杂度O(n)仅遍历链表一次。空间复杂度O(1)仅使用两个额外指针无额外存储空间。满足题目 “不改变链表、尽可能高效” 的要求。总结核心逻辑通过快慢指针构建 k 步距离同步移动后慢指针定位倒数第 k 个结点关键校验覆盖空链表、k≤0、k 超链表长度三类失败场景效率特性时间复杂度 O (n)、空间复杂度 O (1)满足题目 “高效且不修改链表” 的要求。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2420021.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!