首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

链表问题】删除链表第K个节点

前言 以专题形式更新刷题贴,欢迎跟我一起学习刷题。每道题会提供简单解答。 【题目描述】 链表删除倒数第 K 个节点。...【要求】 如果链表长度为 N, 时间复杂度达到 O(N), 额外空间复杂度达到 O(1) 【难度】 士 【解答】 删除时候会出现三种情况: 1、不存在倒数第 K 个节点,此时不用删除。...2、倒数第 K 个节点就是第一个节点。 3、倒数第 K 个节点在第一个节点之后。 所以我们可以用一个变量 num 记录链表一共有多少个节点。 如果 num < K,则属于第一种情况。...如果 num == K,则属于第二情况。 如果 num > K, 则属于第三种情况,此时删除倒数第 K 个节点等价于删除第 (num - k + 1) 个节点。...//定位到这个点前驱 while (num - K !

1.7K10

【Leetcode -147.对链表进行插入排序 -237.删除链表节点

Leetcode -147.对链表进行插入排序 题目: 给定单个链表头 head ,使用 插入排序 对链表进行排序,并返回 排序后链表头 。...每次迭代插入排序只从输入数据移除一个待排序元素,找到它在序列适当位置,并将其插入。 重复直到所有输入数据插入完为止。...即可 return dummy->next; } Leetcode - 237.删除链表节点 有一个链表 head,我们想删除它其中一个节点 node。...给你一个需要删除节点 node 。你将 无法访问 第一个节点 head。 链表所有值都是 唯一,并且保证给定节点 node 不是链表最后一个节点。 删除给定节点。...注意,删除节点并不是指从内存删除它。这里意思是: 给定节点值不应该存在于链表链表节点数应该减少 1。 node 前面的所有值顺序相同。 node 后面的所有值顺序相同。

6410

链表第i个位置后插入一个节点(阿里+腾讯等面试题总结)

时间:2014.04.26 地点:基地 ————————————————————————— 一、题目 题目是非常easy和基础,就是链表第i个位置后插入一个节点。要求写代码,5分钟之内完毕。...2.然后再在刚刚得到指针之后插入节点 Node* ListLocate(Node* head_ptr,size_t position) { Node* curosr=nullptr; for(size_t...个人比較喜欢固定一种模式,即经常使用代码编写模式,假设算法实现原理是一样,仅仅是代码表现上有所差别,我认为就不是必需花心思耍花样。...链表实现中比方还可提炼几种编码规范: 1.使用cursor遍历链表指针 for(Node* head_ptr;cursor!...=nullptr;cursor=curosr->get_link()) { ....... } 2.提供两个版本号编号定位节点函数或者匹配定位节点函数 发布者:全栈程序员栈长,转载请注明出处

73430

用O(1)时间复杂度删除链表某个节点

给定链表头指针和一个结点指针,O(1)时间删除该结点。...链表结点定义如下: struct ListNode { int m_nKey; ListNode* m_pNext; }; 函数声明如下: void DeleteNode...(ListNode* pListHead, ListNode* pToBeDeleted); 这是一道广为流传Google面试题,考察我们对链表操作和时间复杂度了解,咋一看这道题还想不出什么较好解法...一般链表删除某个节点,需要知道删除节点前一个节点,则需要O(n)遍历时间,显然常规思路是不行。...仔细看题目,换一种思路,既然不能在O(1)得到删除节点前一个元素,但我们可以轻松得到后一个元素,这样,我们何不把后一个元素赋值给待删除节点,这样也就相当于是删除了当前元素。

80380

设计链表删除值相同多余结点算法

这是一个无序链表,我们采用一种最笨办法,先指向首元结点,其元素值为2,再遍历该结点后所有结点,若有结点元素值与其相同,则删除;全部遍历完成后,我们再指向第二个结点,再进行同样操作。...看图解: 这里有两个指针变量p、q,均指向链表首元结点,我们先不移动指针p,而是让指针q去遍历之后所有结点。...这样就成功删除了一个与首元结点重复结点,接下来以同样方式继续比较,直到整个链表都遍历完毕,此时链表已无与首元结点重复结点;然后我们就要修改p指针指向,让其指向首元结点下一个结点,再让q指向其下一个结点...,继续遍历,将链表与第二个结点重复所有结点删除。...以此类推,直至指针p也遍历完了整个链表,则算法结束。

2.2K10

重学数据结构(一、线性表)

它是单向链表基础上加以改进形成, 可以解决单向链表单方向查找缺点。...将链表末尾结点指针域 null 变为指向第—个结点, 逻辑上形成一个环型, 该存储结构称之为单向循环链表。 示意图如下: ?...它相对链表而言, 其优点是不增加任何空间情况下, 能够已知任意结点地址,可以找到链表所有结点(环向查找)。 空循环线性链表根据定义可以与单向链表相同, 也可以不相同。...双向循环链表各种算法与双向链表算法大同小异, 其区别与链表和单向循环链表区别一样, 就是判断末尾结点条件不同。...3.3、LinkedList Java集合,LinkedList是基于双向链表(jdk1.8以前是双向循环链表)实现。 具体源码分析可查看:LinkedList源码阅读笔记 4、总结 ?

69030

javaIterable接口使用,实现一个链表迭代器

链表实现: public class MyLinkedList { private static class Entry{ private E value;...iterator()返回值会返回一个迭代器对象,这个迭代器对象可以作为一个工具来遍历集合类对象。...此外,迭代器更是设计模式,如对图遍历可以实现一个图迭代器,简化代码,将遍历思想抽象出来。 自己实现一个可以遍历上述链表迭代器,这个迭代器需要实现Iterator接口中方法。...主要包括以下三个方法: (1)是否存在下一个对象元素 (2)返回下一个对象元素 (3)删除集合的当前迭代器指向对象元素 public class MyLinkedList ...it.hasNext()){ System.out.print(it.next()+" "); } } } 测试结果: 可以看出通过迭代器循环遍历集合对象元素和

55210

LinkedList浅析

size是双向链表节点个数。...,对链表操作只能从一端开始,如果需要查找链表某一个结点,则需要从头开始进行遍历。...null,tail指向下一个节点tail;尾结点head指向前一个结点head,tail 指向为null,是双向关系; 链表若需要查找某一个元素时,都必须从第一个元素开始进行查找,而双向链表除开头节点和最后一个节点外每个节点中储存有两个指针...---- LinkedList本质是双链表,实现 List 和 Deque接口: LinkedList,每个节点都用内部类Node表示: 具体过程可以看下面这张图: 点我 每个node都是节点...当然直接在末尾添加数据ArrayList用时也不是特别多,因为末尾操作后面没有数据。

43210

LinkedHashMap源码分析,死磕到底

,继承自HashMapNode类,next用于链表存储于桶,before和after用于双向链表存储所有元素。...afterNodeInsertion(boolean evict)方法 节点插入之后做些什么,HashMapputVal()方法中被调用,可以看到HashMap这个方法实现为空。...afterNodeAccess(Node e)方法 节点访问之后被调用,主要在put()已经存在元素或get()时被调用,如果accessOrder为true,调用这个方法把访问到节点移动到双向链表末尾...(3)把访问节点加到双向链表末尾;(末尾为最新访问元素) afterNodeRemoval(Node e)方法 节点被删除之后调用方法。...,则可以按插入元素顺序遍历元素; (4)如果accessOrder为true,则可以按访问元素顺序遍历元素; (5)LinkedHashMap实现非常精妙,很多方法都是HashMap钩子(

53910

死磕 java集合之LinkedHashMap源码分析

,继承自HashMapNode类,next用于链表存储于桶,before和after用于双向链表存储所有元素。...afterNodeInsertion(boolean evict)方法 节点插入之后做些什么,HashMapputVal()方法中被调用,可以看到HashMap这个方法实现为空。...afterNodeAccess(Node e)方法 节点访问之后被调用,主要在put()已经存在元素或get()时被调用,如果accessOrder为true,调用这个方法把访问到节点移动到双向链表末尾...把访问节点加到双向链表末尾;(末尾为最新访问元素) afterNodeRemoval(Node e)方法 节点被删除之后调用方法。...,则可以按插入元素顺序遍历元素; (4)如果accessOrder为true,则可以按访问元素顺序遍历元素; (5)LinkedHashMap实现非常精妙,很多方法都是HashMap钩子(

41240

数据结构Java实现:循环链表和双向链表

上篇教程给大家分享了链表概念,以及如何用 Java 实现一个链表结构:数据结构Java实现:链表。...链表是最基础一种链表结构,实际开发使用有一些局限性,比如只能单向往后查找节点,如果需要找到某元素前驱节点链表是无法实现,今天来给大家分享另外两个复杂一些链表结构:循环链表和双向链表。...循环链表 循环链表本质上就是一种链表,两者不同之处在于链表中最后一个节点指针指向哪里,链表末尾节点指针指向空,如下图所示。 ?...而在循环链表末尾节点指针指向首节点,形成一个闭环,所以它叫循环链表,应该很好理解,如下图所示。 ?...如上所示,删除节点必须先找到其前驱节点链表是不会记录元素前驱节点,所以必须从头开始遍历链表,直到找到目标节点前驱节点,时间复杂度为 O(n)。

3.4K20

入门链表

链表简介 链表(linked list)作为一种常见数据结构,通常由数据和指针组合而成。一些没有指针结构程序语言中,如 python、java等,指针被引用所代替。...链表每个节点通过指针或引用相连接,你可以通过指针或者引用来遍历节点。 下图为单个节点构成: ? 链表也有很多种形式,有链表、循环链表、双向链表,下面我们介绍一种常用链表: ?...链表,每个节点包括指向下一个节点指针。但是链表首尾节点却特立独行,头结点只有指针,却没有数据;尾节点恰好相反,只有数据,没有指针,也就是提示我们链表后面不再有其他节点。...特定节点前面插入数据:新建一个节点,然后找到特定节点前驱结点,然后让新节点next指向特定节点,而前驱结点也要指向新节点。...将旧链表每一个元素插入到新链表头结点后面。这样,先插入数据反而被后插入数据挤到了后面,原先最前面的数据节点变成了新链表节点,而原先节点却变成了新链表最前面的数据节点

61930
领券