用递归方法求单链表中的倒数第k个节点

时间: 2023-10-10 19:11:57 浏览: 104
我们可以使用双指针来解决这个问题。首先让一个指针p1指向链表的头节点,然后让它向前移动k-1步,这时再让另一个指针p2从头节点开始,然后p1和p2同时向前移动,直到p1到达链表的尾节点,此时p2所指向的节点就是倒数第k个节点。 递归方法的思路是这样的:我们定义一个全局变量count,表示当前递归到的节点的位置,然后递归到链表的尾节点时开始回溯,回溯时每经过一个节点count就加1,当count等于k时就返回该节点的值。具体实现可以参考下面的代码: ``` int count = 0; ListNode* findKthToTail(ListNode* head, int k) { if (head == nullptr) return nullptr; ListNode* node = findKthToTail(head->next, k); count++; if (count == k) return head; return node; } ``` 在调用函数时,我们需要将count初始化为0,然后传入链表的头节点和k值,代码如下: ``` ListNode* node = findKthToTail(head, k); ``` 这样就可以得到单链表中的倒数第k个节点了。
相关问题

假设单链表中存放的是整数 1、用递归方法求解单链表的长度; 2、用递归方法求解单链表中所有数的平均数; 3、用递归方法求单链表中倒数第k个结点元素。

1. 求单链表长度的递归方法如下: ``` int getLength(ListNode* head) { if (head == nullptr) { return 0; } return 1 + getLength(head->next); } ``` 2. 求单链表所有数的平均数的递归方法如下: ``` double getAverage(ListNode* head) { if (head == nullptr) { return 0; } int sum = head->val; int count = 1; if (head->next != nullptr) { pair<int, int> result = getSumAndCount(head->next); sum += result.first; count += result.second; } return (double)sum / count; } ``` 3. 求单链表中倒数第k个结点元素的递归方法如下: ``` ListNode* getKthFromEnd(ListNode* head, int k) { if (head == nullptr) { return nullptr; } ListNode* node = getKthFromEnd(head->next, k); if (node != nullptr) { return node; } if (k == 1) { return head; } return nullptr; } ```

实验题2:用递归算法求单链表中倒数第K个结点。 目的:深入掌握单链表递归算法设计方法。 内容:编写一个程序exp5-2.py,用递归求解单链表中倒数第K个结点.

好的,下面是我的代码实现: ```python class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next def find_kth_node(head: ListNode, k: int) -> ListNode: if k <= 0 or not head: return None fast = slow = head for _ in range(k): if not fast: return None fast = fast.next while fast: fast = fast.next slow = slow.next return slow ``` 代码思路如下: 1. 首先检查 k 是否小于等于 0 或者 head 是否为空,如果是,返回 None。 2. 定义两个指针 fast 和 slow,让 fast 先走 k 步,然后 slow 和 fast 同时移动,直到 fast 到达链表末尾。 3. 返回 slow。 这里使用了快慢指针的思想,时间复杂度为 O(n)。

相关推荐

最新推荐

recommend-type

C++使用递归和非递归算法实现的二叉树叶子节点个数计算方法

主要介绍了C++使用递归和非递归算法实现的二叉树叶子节点个数计算方法,涉及C++二叉树的定义、遍历、统计相关操作技巧,需要的朋友可以参考下
recommend-type

Oracle通过递归查询父子兄弟节点方法示例

主要给大家介绍了关于Oracle如何通过递归查询父子兄弟节点的相关资料,递归查询对各位程序员来说应该都不陌生,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
recommend-type

sql server递归子节点、父节点sql查询表结构的实例

本文通过实例给大家介绍了sql server递归子节点、父节点sql查询表结构的实例解析,非常不错,具有参考借鉴价值,需要的的朋友参考下
recommend-type

C#递归遍历窗体所有textbox控件并设置textbox事件的方法

主要介绍了C#递归遍历窗体所有textbox控件并设置textbox事件的方法,包括针对textbox控件的递归遍历技巧与事件方法的设置技巧,需要的朋友可以参考下
recommend-type

python json 递归打印所有json子节点信息的例子

今天小编就为大家分享一篇python json 递归打印所有json子节点信息的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

list根据id查询pid 然后依次获取到所有的子节点数据

可以使用递归的方式来实现根据id查询pid并获取所有子节点数据。具体实现可以参考以下代码: ``` def get_children_nodes(nodes, parent_id): children = [] for node in nodes: if node['pid'] == parent_id: node['children'] = get_children_nodes(nodes, node['id']) children.append(node) return children # 测试数
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。