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

链表基础&LeetCode题解

从图中可以看出来:当某个结点不是指向下一个结点,而是指向了null,空地址,那么这个结点就是这个链表最后一个结点,也就是尾结点。...比如我要在某个结点B的前面插入数据,那么我需要从头开始便利,找到某个结点的next指向这个B的地址,然后进行数据的插入。 但是双向链表则可以直接获知结点B的前驱结点地址,大大提高了插入效率。...链表的基础知识就介绍到这里了,下面看一个链表相关的算法题。 题目:从尾到头打印链表 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。...递推阶段:走到链表结尾为结束的标志。 归档阶段:从结尾处一层层输出数字,先输出到ArrayList,转为数组。...(栈的知识点后面再细说) 先入后出不就是题目的需求么,从尾部倒着输出数字。 所以我们把链表依次入栈,然后依次出栈就可以完成需求了。

36110

程序员必备的50道数据结构和算法面试题

闲言少叙,下面就是我给出程序类面试中最常问到的问题清单 数组问题 数组是最常用的基础数据结构,它将元素保存在连续的内存中。...不过和数组不同的是,链表的元素不是存储连续位置中,而是分散各个内存中的各个位置,通过节点链接起来。一个链表就是一个包含了下个节点内存地址的节点列表。...链表有几种不同的形式。首先是单向链表,在这个结构你只能向一个方向遍历(向前或者反转);其次是双向链表,你可以双向遍历(向前或者向后);最后是环形链表,组成一个环的形式。...下面是一些最常见和流行的链表面试问题 1、一次遍历中,怎样发现单个链表的中间元素? 2、怎样验证给定的链表是环形的? 怎样发现这个环的起始节点? 3、怎样翻转链表?...4、不使用递归,怎样反转单个链表? 5、未排序链表中,怎样移除重复的节点? 6、怎样找出单个链表的长度? 7、从单个链表结尾处,怎样找出链表的第三个节点? 8、怎样使用栈计算两个链表的和?

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

程序员必备的50道数据结构和算法面试题

闲言少叙,下面就是我给出程序类面试中最常问到的问题清单: 数组问题 数组是最常用的基础数据结构,它将元素保存在连续的内存中。...不过和数组不同的是,链表的元素不是存储连续位置中,而是分散各个内存中的各个位置,通过节点链接起来。一个链表就是一个包含了下个节点内存地址的节点列表。...链表有几种不同的形式。首先是单向链表,在这个结构你只能向一个方向遍历(向前或者反转);其次是双向链表,你可以双向遍历(向前或者向后);最后是环形链表,组成一个环的形式。...下面是一些最常见和流行的链表面试问题 1、一次遍历中,怎样发现单个链表的中间元素? 2、怎样验证给定的链表是环形的? 怎样发现这个环的起始节点? 3、怎样翻转链表?...4、不使用递归,怎样反转单个链表? 5、未排序链表中,怎样移除重复的节点? 6、怎样找出单个链表的长度? 7、从单个链表结尾处,怎样找出链表的第三个节点? 8、怎样使用栈计算两个链表的和?

3.2K11

LeetCode | 2.两数相加

,然后返回值也是一个链表,然后我们要做的就是让两个链表的每个节点相加,并产生新的节点构成一个新的链表,并且链表上的每个节点只能存储一位数。...两个链表的每个节点相加,然后所得的结果存在一个新的链表节点当中,且这个节点中只能存一位数。...链表最后的一对节点相加后也可能会产生进位,因此循环相加后,需要判断是否产生了进位,如果有进位需要为这个进位一个单独的节点链到链表结尾处。...当一个链表比另外一个链表长的时候,只要让较长的那个链表和 0 相加即可。直到两个链表都为空为止。...,点击右下角的 “执行代码”,然后观察 “输出” 和 “预期结果” 是否一致,一致的话就点击 “提交” 按钮。

32020

89 次荣登活跃榜,最高排名第 9 ,从零学算法第二周周报发布

15 程序为什么学算法 昨日作业题总结 迭代法: 今日作业题 Day 16 时间复杂度入门 为什么要学算法,25位星友给出各自的答案 今日作业题 Day17 算法好坏度量:大 O 记号 1 数学定义...当插入一个新键时,哈希函数决定该键应该分配到哪个桶中,并将该键存储相应的桶中; 当搜索一个键时,哈希表使用相同的哈希函数来查找对应的桶,并只特定的桶中进行搜索。...,值为23的节点为表头,它的指针域取值是下一个节点的指针,依次类推,最后串成一条线: 这是链表这个数据结构的特点。...,并使tmp和cur_Node分别指向这个空表头,for 中依次创建一个节点,tmp完成链表串联任务。...Day 16 时间复杂度入门 为什么要学算法,25位星友给出各自的答案 近来经常有朋友问,程序员需要学算法吗?为什么需要学算法?不会算法也能找个Java开发岗造软件所以就别浪费时间了。

64310

hashmap的底层实现原理_hashtable底层数据结构

2、链表结构:存储区间离散、占用内存宽松、空间复杂度小 优点:插入删除速度快,内存利用率高,没有固定大小,扩展灵活 缺点:不能随机查找,每次都是从第一个开始遍历(查询效率低) 3、哈希表结构:结合数组结构和链表结构的优点...(3)通过哈希表函数/哈希算法,将hash值转换成数组的下标,下标位置上如果没有任何元素,就把Node添加到这个位置上。如果说下标对应的位置上有链表。...如其中有一个equals返回了true,那么这个节点的value将会被覆盖。...如果这个位置上有单向链表,那么它就会拿着K和单向链表上的每一个节点的K进行equals,如果所有equals方法都返回false,则get方法返回null。...为什么要这样设计呢?好处就是避免最极端的情况下链表变得很长很长,查询的时候,效率会非常慢。

40820

LeetCode002|返回倒数第k个节点

,因为我还是需要靠它吃饭,毕竟在国内这样的环境下,开源的内容都会把别人据为己有,记得某位大神写了一个框架却被某企业申请了专利,开源就开源了,怎么还闭源了呢,令人作呕的现象,所以,自己的文章就是一种示例程序...0x02,题目简述 实现一种算法,找出单向链表中倒数第 k 个节点。 返回该节点的值。...0x03,示例 输入:1->2->3->4->5 和 k = 2 输出:4 0x04,题解思路 首先要检查链表是否为空,为空则直接返回-1,不为空,利用快慢指针的做法,先让快指针先跑k,然后并排跑,...这样当快指针走到链表结尾处,这样慢指针指向的值就是需要返回的值了。...0x06,总结 这是自己总结LeetCode这样的算法题的第二篇,觉得还是很有必要来总结和沉淀一下的,毕竟已经写了那么多道题,如果自己不去沉淀到每一篇文章进行输出,随着时间的流逝,除了提交代码的历史记录中有所记录代码的身影之外

26220

以后再也不怕别人问「单链表」的问题啦 。

程序设计里,我们经常需要将同为某个类型的一组数据元素作为一个整体来使用,需要创建这种元素组,用变量来记录它们或者传入函数等等等等,「线性表」就是这样一组元素的抽象,它是某类元素的集合并且记录着元素之间一种顺序关系...「头结点」的设立是为了操作的统一和方便,是放在第一个元素的节点之前,它的数据域一般没有意义,并且它本身也不是链表必须要带的。那设立头节点的目的是什么呢?...其实就是为了某些时候可以更方便的对链表进行操作,有了头结点,我们在对第一个元素前插入或者删除结点的时候,它的操作与其它结点的操作就统一了。...单链表 n 个结点链接成一个链表,这也就是平时书上所说的「链式存储结构」,因为这个链表中的每个结点中只包含一个指针域,所以又叫「单链表」。...: 1 4 5 8 2 3 2.计算单链表的长度 使用链表的时候,经常需要求表的长度,为此我们可以创建一个球表长的函数,这个函数就是从左到右扫描,遍历表中的所有结点并完成计数,时间复杂度为 O(n

27110

以后再也不怕别人问「单链表」的问题啦。

本文字数:5055 字 阅读本文大概需要:13 分钟 写在之前 程序设计里,我们经常需要将同为某个类型的一组数据元素作为一个整体来使用,需要创建这种元素组,用变量来记录它们或者传入函数等等等等,「线性表...「头结点」的设立是为了操作的统一和方便,是放在第一个元素的节点之前,它的数据域一般没有意义,并且它本身也不是链表必须要带的。那设立头节点的目的是什么呢?...其实就是为了某些时候可以更方便的对链表进行操作,有了头结点,我们在对第一个元素前插入或者删除结点的时候,它的操作与其它结点的操作就统一了。...单链表 n 个结点链接成一个链表,这也就是平时书上所说的「链式存储结构」,因为这个链表中的每个结点中只包含一个指针域,所以又叫「单链表」。...: 1 4 5 8 2 3 2.计算单链表的长度 使用链表的时候,经常需要求表的长度,为此我们可以创建一个球表长的函数,这个函数就是从左到右扫描,遍历表中的所有结点并完成计数,时间复杂度为 O(n):

27210

【数据结构与算法】链表2W字终极无敌总结

例如当前容量为100,满了以后增容到 200,我们再继续插入了5个数据,后面没有数据插入了,那么就浪费了95个数据空间。 思考: 如何解决以上问题呢?下面给出链表的结构来看看。 2....(可以看成每一节车厢的编号) 在下面的介绍中,会发现将创建结点的代码单独放在了一个函数中,我们知道,一个变量出了函数的作用域会由于栈帧的操作释放该变量,导致返回值不能使用,但是这个为什么可以呢?...缺陷:当我们想要删除除了头的任何一个当前位置时,需要记录他的前一个节点,这就需要去寻找这个节点,因此时间复杂度为O(N)。 既然有缺陷,那么有没有方式去弥补这个缺陷呢?...复制带随机指针的链表 138. 复制带随机指针的链表 给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。...在此基础上进行改造: 一个节点的后方,拷贝一个与该节点一模一样的节点(当然地址肯定不一样喽)即图中的copy节点插入到原链表,这样就可以对random指针进行下面操作: copy->random

1.2K00

公司数据结构+算法面试100题

★用一种算法一个循环的链接表里插入一个节点,但不得穿越链接表。   ★用一种算法整理一个数组。你为什么选择这种方法?   ★用一种算法使通用字符串相匹配。   ★颠倒一个字符串。优化速度。...写一个程序, 求一棵二叉树中相距最远的两个节点之间的距离。...但这个思路没有利用输入数组的特性,我们应该能找到更好的解法。 70.给出一个函数来输出一个字符串的所有排列(经典字符串问题)。 ANSWER 简单的回溯就可以实现了。...5.只给定单链表中某个结点p(非空结点),p前面插入一个结点。 办法与前者类似,首先分配一个结点q,将q插入p后,接下来将p中的数据copy入q中, 然后再将要插入的数据记录在p中。...2.链表里如何发现循环链接? 3.编写反转字符串的程序,要求优化速度、优化空间。 4.给出洗牌的一个算法,并将洗好的牌存储一个整形数组里。

3.2K90

算法--链表相关套路

链表 链表题一般常考 定义 单链表一个节点 + 指向下一个节点的指针 头指针:第一个节点,head 尾指针:最后一个节点,tail 双向链表:单链表增加指向前继结点的指针 特点 增加、删除特别方便,复杂度...= key: cur = cur.next return True # 做需要的操作 插入一个节点(后插法): def insert_after(node, new_node):...环形链表 空间换时间:哈希表法 这个问题有几种解决方案。...如果空间不是问题,最简单的方法是从头开始通过下一个字段探索节点,并将访问的节点存储哈希表中-仅当我们访问哈希表中已经存在的节点时,存在一个循环。...如果不存在循环,则搜索结尾处结束(通常通过将下一个字段设置为null来表示)。 此解决方案需要O(n)空间,其中n是列表中的节点数。

43520

Java常见的8种数据结构「建议收藏」

链表的核心: 链表的核心就是指针域,通过对指针域的操作实现增加节点删除节点,所谓链表就是形象的表示出一环扣一环,这是链表的优点也是缺点,优点是:插入删除不需要移动所有节点,只需要将待插入节点的指针域一个指向待插入位置的后一个节点...,程序遍历二叉树将非常容易,无需进行任何思考,直接遍历底层数组即可。...,对输入值做换算(切碎),最终给出固定长度的二进制输出值; 哈希表(Hash Table),也叫散列表,是一种可以通过关键码值(key-value)直接访问的数据结构,它最大的特点就是可以快速实现查找、...哈希函数哈希表中起着⾮常关键的作⽤,它可以把任意长度的输入变换成固定长度的输出,该输出就是哈希值。...,这个订点必须是当前顶点的邻接点,标记他,并插入队列中 如果1执行完事,则从队列中取一个顶点做为当前顶点,重复执行1 2 队列为空 不能执行2 则结束 无环有向图 的拓扑排序 将有向图中的顶点以线性方式进行排序

69830

深入理解JDK8 HashMap

至于为什么JDK8一定条件下将链表转换为红黑树,我相信很多人都会回答:为了提高查询效率。...第三步:如果获取到首节点(或根节点)为null,说明当前哈希表的位置上没有任何链表或者红黑树,此时将key和value封装成Node节点对象存储到首节点位置。...对象并插到链表结尾处。...完成结尾处插入之后,就会依据条件binCount >= 7来判断是否尝试将链表转换为红黑树,这里之所以是遍历次数大于等于7,这是因为从链表的第二个节点开始的。...假设,如果设计成链表个数超过8则链表转换成树结构,链表个数小于8则树结构转换成链表,如果一个HashMap不停的插入、删除元素,链表个数8左右徘徊,就会频繁的发生树转链表链表转树,效率会很低。

77610

链表基础知识(一、单链表、头插、尾插、头删、尾删、查找、删除、插入

例如当前容量为100,满了以后增容到 200,我们再继续插入了5个数据,后面没有数据插入了,那么就浪费了95个数据空间。 思考: 如何解决以上问题呢?下面给出链表的结构来看看。...1.22问:那为什么还需要指针变量来保存下一个节点的位置?...答:链表中每个节点都是独立申请的(即需要插入数据时才去申请一块节点的空间),我们需要通过指针变量来保存下一个节点位置才能从当前节点找到下一个节点。...二、链表的分类: 2.1实际中要实现的链表的结构非常多样,以下情况组合起来就有8种链表结构: 头节点:是一个节点,本质上是一个结构体变量,区分数据域和指针域,不存放任何数据,只存放指向链表中真正存放数据的第一个节点的地址...** phead, int i); 3.3打印链表 第一步:输出一个节点的数据域,输出完毕后,让指针保存后一个节点的地址 第二步:输出移动地址对应的节点的数据域,输出完毕后,指针继续后移 第三步

24810

链表:总结篇!(每逢总结必经典)

链表的一大问题就是操作当前节点必须要找前一个节点才能操作。这就造成了,头结点的尴尬,因为头结点没有前一个节点了。 「每次对应头结点的情况都要单独处理,所以使用虚拟头结点的技巧,就可以解决这个问题」。...这是练习链表基础操作的非常好的一道题目,考察了: 获取链表第index个节点的数值 链表的最前面插入一个节点 链表的最后面插入一个节点 链表第index个节点前面插入一个节点 删除链表的第index...我链表:环找到了,那入口呢?中给出了详细的推理,兼顾易懂和简洁了。 这是一位录友评论区有一个疑问。我感觉这个问题很不错,但评论区根本说不清楚,趁着总结篇,补充一下这个证明。...推理过程中,「为什么第一次环中相遇,slow的 步数 是 x+y 而不是 x + 若干环的长度 + y 呢?」 了解这个问题一定要先把文章链表:环找到了,那入口呢?看了,即文章中如下的地方: ?...「slow开始走的那一环已经和fast相遇了」。 那有同学又说了,为什么fast不能跳过去呢?刚刚已经说过一次了,「fast相对于slow是一次移动一个节点,所以不可能跳过去」。

54730

跳跃表深入理解

一张关于跳表和跳表搜索过程如下图: 图中,需要寻找 68,在给出的查找过程中,利用跳表数据结构优势,只比较了3次,横箭头不比较,竖箭头比较。...红黑树空间和时间效率上略胜跳跃表一筹,但跳跃表实现上相对简单,颇得程序猿们的青睐。redis和leveldb中都有采用跳表。...但是普通BST对于插入元素越有序效率就越低,最坏情况会退化回链表。因此提出了自平衡BST结构,保证任何情况下的增删查操作都保持O(logn)的时间复杂度。...跳表就是如下图的链表集合: 跳表具有的性质: 由很多层组成,最底层为第1层,以此类推。层数不会超过一个固定的最大值MAX。 每层都是一个由头节点的有序链表,第1层的链表包含跳表中的所有元素。...当查找元素时,会从最顶层链表的头节点开始遍历。如当前节点的下一个节点包含的值比目标元素值小,则继续向右查找。如果下一个节点的值比目标值大,就转到当前层的下一层去查找。

39420

面试被问到HashMap 底层原理?看完这边文章绝对不慌!

:我是猴哥Money老师 ---- 技术的本质,底层结构 程序是等于我们的数据结构和算法 HashMap 其实就是做存储的,做存储的就是数据结构 JDK7 : HashMap 是由 数组,链表...,后面的节点都要改变,这样我们可以看出,这就是数组,删除,插入 为什么这么慢!...删除 某个节点,只需要上一个节点 head.next =null 插入 某个几点,只需要上一个节点 head.next 指向插入节点插入节点指向下一个节点 查询某个节点链表查询都要通过头节点...扩充 我们java 中,哪一个util 类采用的链表来实现的?...Hash冲突怎么解决了 我们用链表来解决这个问题, 链表是有一个指针的,我们可以让这个lies 指向这个foes,我们让foes 去匹配下标为9 的这个节点,如果匹配lies 不相等,则去匹配下一个节点

25020

Java实现单向链表

3.3插入节点 插入一个节点链表中,首先得判断这个位置是否是合法的,才能进行插入~ 找到想要插入的位置的上一个节点就可以了~ /** * 插入节点 * * @param...= null),退出循环就会找到尾节点) 遍历链表 从首节点(有效节点)开始,只要不为null,就输出 给定位置插入节点链表中 将原本由上一个节点的指向交由插入节点来指向 上一个节点指针域指向想要插入节点...首先判断该位置是否有效(链表长度的范围内) 找到想要插入位置的上一个节点 ?...获取链表的长度 每访问一次节点,变量++操作即可 删除给定位置的节点 将原本由上一个节点的指向后面一个节点 首先判断该位置是否有效(链表长度的范围内) 找到想要插入位置的上一个节点 ?...,只要它相等,就能删除了~ 查询链表的中间节点 这个算法也挺有趣的:一个每次走1步,一个每次走两步,走两步的遍历完,然后走一步的指针,那就是中间节点 递归从尾到头输出链表 只要下面还有数据,那就往下找

2.5K103
领券