首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

漫画:如何找到链表倒数n结点?

我们以下面这个链表为例: 给定链表头结点,但并不知道链表实际长度,要求我们找到链表倒数n结点。 假设n=3,那么要寻找结点就是元素1: 如何利用队列呢?...小灰思路如下: 1.创建一长度为n队列,遍历原始链表,让结点逐一进入队列: 2.当队列已满时,让队尾元素出队,新结点入队: 3.当链表全部结点遍历完毕时,队尾元素就是倒数n结点(因为队列长度是...n): 首先,我们创建两指针P1和P2,P1指向链表头结点,P2指向链表正数n结点(也就是例子中3结点): 接下来,我们让指针P1和P2同时循环右移,每次右移一步,直到指针P2移动到链表末尾...: 此时,由于P2指向链表尾结点,且P1和P2距离是n-1,因此P1所指结点就是我们要寻找链表倒数n结点: 显然,这个方法从头到尾只需要对链表做一次遍历,而且仅仅使用了两指针,算法空间复杂度是...head; Node p2 = head; //把p2指针移动到正数n结点 for(int i=1; i<n; i++){ p2

80840
您找到你想要的搜索结果了吗?
是的
没有找到

如何删除给定单向链表倒数N元素

如何删除给定单向链表倒数N元素? 先分析下有哪些关键词: 1. 单向链表,那也就是我们只能单向遍历; 2....倒数N元素,只能先遍历到尾部,才知道倒数N元素是什么,但问题又出现了,是单向链表,不能反向遍历,那该如何解决呢? 3....删除,要想删除某一元素,是需要知道这个指定元素前一元素才行,那我们其实要找到倒数N+1元素....以如下队列为例,如果要删除倒数2元素,就要找到倒数3元素,也就是倒数N+1元素,那改如何做呢? 首先一定需要一指针遍历到队列尾部,那怎么记录这个指针已经遍历过元素呢?...两指针按照同样速度同时移动,当快指针到达结尾时候,慢指针也就到达了倒数N+1元素位置. 再细分下,如果要删除目标元素正好和链表长度相同呢?

64110

Python-排序-快速排序,如何在O(n)内找到K大元素?

比如现在要时间复杂度为 O(n),在一长度为 n 数组中查找到 K 大元素,你会怎么做呢?...你可能会说这很简单啊,第一次遍历数组找到 1 大元素,第二次遍历找到 2 大,…, K 次就可以找到 K 大 但是这样时间复杂度就不是 O(n),而是 K*O(n),当 K 接近 n 时,时间复杂度就是...如果你运用快速排序算法思想,你就可以在 O(n) 时间复杂度内找到 K 大元素。 快速排序算法 快速排序算法和归并排序算法一样,都是利用分治算法。...O(n)时间内查找 K 大元素方法 通过观察运行上面快速排序过程可以发现,第一分区键为 82,在第一次分区后,它是数组中 6 元素,那么可以断定,82 就是 6 小元素,或者 82 就是...如果我们把每次分区遍历元素个数加起来,就是:n+n/2+n/4+n/8+…+1。这是一等比数列求和,最后和等于 2n-1。所以,上述解决思路时间复杂度就为 O(n)。

51020

链表-如何高效删除链表倒数N节点

题目 给定链表,删除链表倒数 n 节点,并且返回链表头结点 示例 给定链表: 1->2->3->4->5, 和 n = 2 当删除了倒数第二节点后,链表变为 1->2->3->5 思考...= nil{ len++W temp1 = temp1.Next } //倒数n就等正数(len-n)+1 m := len- n...return head } for i:=0; i<=len-1;i++{ //找到要删除节点上一节点 //将这个节点下一指针指到要删除节点下一节点...,第二次用来找到要删除倒数n元素,有没有更好办法呢,只遍历一次?...解法二 解法一已经实现了我们想要功能,我们回看上面的思考(只扫描一趟实现此功能),我们看这个问题本质,倒数n就等正数(len-n)+1,我们看下图: ?

1.3K30

2022-06-25:给定正数n, 表示有0~n-1号任务, 给定长度为n数组time,time表示i号任务做完时间, 给定二维数组mat

2022-06-25:给定正数n, 表示有0~n-1号任务,给定长度为n数组time,timei表示i号任务做完时间,给定二维数组matrix,matrixj = {a, b} 代表:a...任务想要开始,依赖b任务完成,只要能并行任务都可以并行,但是任何任务只有依赖任务完成,才能开始。...返回一长度为n数组ans,表示每个任务完成时间。输入可以保证没有循环依赖。来自美团。3.26笔试。答案2022-06-25:拓扑排序基础上做动态规划。代码用rust编写。...[]; for i in 0..n { nexts.push(vec![]); } let mut in0: Vec = vec!...[]; for _ in 0..n { ans.push(0); } for i in 0..n { if in0[i as usize] == 0 {

34510

2023-05-05:给定无向、连通树 树中有 n 标记为 0...n-1 节点以及 n-1 条边 。 给定整数 n 和数组 edges , edge

2023-05-05:给定无向、连通树树中有 n 标记为 0...n-1 节点以及 n-1 条边 。...给定整数 n 和数组 edges ,edgesi = ai, bi表示树中节点 ai 和 bi 之间有一条边。...返回长度为 n 数组 answer ,其中 answeri : 树中 i 节点与所有其他节点之间距离之和。输入: n = 6, edges = [0,1,0,2,2,3,2,4,2,5]。...答案2023-05-05:思路:给定一棵无向、连通树,要求计算每个节点到其他所有节点距离之和。可以通过遍历树,对于每个节点分别计算它到其他节点距离之和。...对于每个节点,利用它子节点信息来更新它到其他节点距离之和,然后递归地更新它子节点。最终得到所有节点距离之和。具体实现如下:1.构造图通过给定 edges 数组构造无向图。

22110

删除链表倒数n节点

题目: 思路: 由于这是一链表,所以我们一般只能获取到一头结点,然而其他信息我们不确定。所以可以采用双指针方法。...思路一,利用一指针获取整个链表元素总数,利用总数减去目标数,所以我们可以确定要删除位置。...思路二,利用一指针先走出目标数目,然后两指针一起走,那么先走指针走完时,第二指针恰好会停在目标元素上。...OutPutLinkedList(result);     }     /**      * 方案2,用双指针,一先走一定步数,然后一起走,某一先抵达就停止      *      * @param...+ 1;         //总数减去倒数n,就是要遍历位置了         for (int i = 1; i < index - 1; i++) {             p2 = p2.

38720

「拥抱开源」我 N 开源项目

例如技术迭代、逐渐不再维护(俗称烂尾)等等。 所以,我对 GitHub 开源是非常关注,包括看其他神仙公司、或者程序员大佬们开源项目。例如:Apache、Google、Alibaba 等等。...---- 起源 2020年是一灾年。从上帝视角(精神与物质能量守恒定律)来看,当给关上一扇窗户时候,那必然会打开新一扇窗户。 那么当上帝给你关掉很多扇窗户时候,你可以尝试砸开一堵墙 。...于是,在学习大佬开源项目的时候,突然迸发出了想要自己开源项目的热情(绝对不是捡树枝太累导致)。 ---- 现状 上周六提交了第一行代码。...今天(本周六),约定了 Commit Message 提交规范、thymeleaf 模版配置与 demo。 由于只有周末才有时间进行添砖加瓦,所以第一目标是完成核心三大板块:会员、商品、订单。...---- 小结 作为程序员,开源项目是必须要了解、参与进去。(免费东西,它不香吗?) 既然如此,那就主动参与其中吧。

45520

2022-06-25:给定正数n, 表示有0~n-1号任务,给定长度为n数组time,time表示i号任务做完

2022-06-25:给定正数n, 表示有0~n-1号任务, 给定长度为n数组time,time[i]表示i号任务做完时间, 给定二维数组matrix, matrix[j] = {a,...b} 代表:a任务想要开始,依赖b任务完成, 只要能并行任务都可以并行,但是任何任务只有依赖任务完成,才能开始。...返回一长度为n数组ans,表示每个任务完成时间。 输入可以保证没有循环依赖。 来自美团。3.26笔试。 答案2022-06-25: 拓扑排序基础上做动态规划。 代码用rust编写。...[]; for i in 0..n { nexts.push(vec![]); } let mut in0: Vec = vec!...[]; for _ in 0..n { ans.push(0); } for i in 0..n { if in0[i as usize] ==

16330
领券