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

面试官系列 - LeetCode链表知识点&题型总结

双向链表 ​ 双向链表支持两个方向,每个节点不只有一个后驱指针next指向后面的节点,还有一个前驱指针prev指向前面的节点。...我们假设一个有环链表,快慢指针最后都会走到环,而这个环就像一个环形跑道一样,慢指针在后面,快指针在前面,但实际上快指针也在追慢指针,希望能超慢指针一圈。...我们不用担心快指针跳过了慢指针,因为他们两速度差是1,所以它们在环距离总是每次减1,最后总能减到0。...二是,归并排序merge阶段需要辅助数组,需要申请O(N)空间,申请空间也是需要时间快排不需要额外申请空间。如果待排序元素存储在链表中,快排优点就变成了缺点。...链表链表只有一个结点 链表中只包含两个结点 代码在处理头结点跟尾结点是否存在什么问题 参考资料: 1.https://leetcode-cn.com/problems/sort-list/discuss

63010

LeetCode链表知识点&题型总结

1、我们定义两个指针,分别称之为g(guard 守卫)和p(point)。 我们首先根据方法参数m确定g和p位置。g移动到第一个要反转节点前面,p移动到第一个要反转节点位置。...例题:21 Merge Two Sorted Lists 【easy】 题意:两个排序链表合并成新有序链表 test case: Input: 1->2->4, 1->3->...我们假设一个有环链表,快慢指针最后都会走到环,而这个环就像一个环形跑道一样,慢指针在后面,快指针在前面,但实际上快指针也在追慢指针,希望能超慢指针一圈。...二是,归并排序merge阶段需要辅助数组,需要申请O(N)空间,申请空间也是需要时间快排不需要额外申请空间。如果待排序元素存储在链表中,快排优点就变成了缺点。...链表链表只有一个结点 链表中只包含两个结点 代码在处理头结点跟尾结点是否存在什么问题 参考资料: 1.https://leetcode-cn.com/problems/sort-list/discuss

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

【29期】Java集合框架 10 连问,你有被问过吗?

HashMap 是 HashTable 轻量级实现,他们完成了Map 接口,主要区别在于 HashMap 允许 null key 和 null value,由于非线程安全,效率可能高于 Hashtable...区别: HashMap允许 null 作为一个 entry key 或者 value, Hashtable 不允许。...封装了一个 HashMap 对象来存储所有的集合元素,所有放入 HashSet 中集合元素实际上由 HashMap key 来保存, HashMap value 则存储了一个 PRESENT...2.TreeSet:TreeSet实现了SortedSet接口,能够对集合中对象进行排序。 Map(映射) Map是一种把键对象和值对象映射集合,它一个元素包含一个键对象和值对象。...Map主要有以下实现类: HashMap:HashMap基于散列表实现,其插入和查询开销是固定,可以通过构造器设置容量和负载因子来调整容器性能。

57630

2023年前端面试题汇总-数据结构(链表

这个时候就会造成空间浪费,所以,数组空间利用率相当于本来需要大小除以创建出来数组大小。 因为链表元素只有当需要时候才会被创建出来,所以不存在需要多预留空间情况。...链表操作 在实现链表时候,通常在链表前面加一个假头,所谓假头,通常也叫作 Dummy Head 或者“哑头”。实际上,就是在链表前面,加上一个额外结点。...链表组件 给定链表头结点 head,该链表每个结点都有一个 唯一整型值 。同时给定列表 G,该列表是上述链表中整型值一个子集。...对于链表操作,实际上我们是在操作链表指针。...迭代实现 对于迭代方式,我们可以创建一个哑结点list,这个节点指向题目给出节点头结点。初始化一个temp,用来保存这个哑结点,初始值list,每次交换交换temp后面的两个节点。

925111

链表排序总结(全)(C++)

排序链表 里面,就会因为超出时间限制没法通过最后一个测试用例。 可以看到,如果可以交换节点值,那使用插入、快排这些顺序遍历可以实现算法都是可以(当然,快排就不能使用双指针法了)。...一节为什么说插入比冒泡更简单呢(无论是链表还是数组,一般优先使用插入排序),看下面的图,如果当前要将节点cur插入到节点pre之后: 可以看到整体操作逻辑简单了许多:我们只需要知道cur前驱和插入位置...数组merge函数我们已经很熟悉了: 需要一个辅助数组,大小与A[p…r]相同,双指针i,j分别指向两个待合并数组开头,假设为A[p…q],A[q+1,r]: 比较A[i]与A[j],较小者放入辅助数组并移动指针指向下一个元素...,右边界增加1 ++j; } swap(a[low], a[i-1]); return i-1; } 为什么要强调第二种我叫不名字方法以及它以开头pivot版本呢,因为接下来我们要用在链表快速排序上面...首先想想我们为什么不用双指针法,因为双指针需要从后往前遍历啊,链表是没法从后往前遍历

66610

Sort List 解题报告(归并排序小结)

1) If head == NULL or 只有一个元素     return head. 2) else 链表分为两个部分,         pSlow是中点; /* pFast, pSlow指针找到中点...,原来递归过程是排序集合一分二,直至排序集合就剩下一个元素位置,然后不断合并两个排好序数组。...所以非递归思想为,数组中相邻元素两两配对。用merge函数将他们排序,构成n/2组长度gap2排序子数组段,然后再将他们排序成长度4子数组段,如此继续下去,直至整个数组排好序。...先将1+1(gap=1)个只有1个结点链表按二路归并方法加到tail结点后面,然后更新tail;接着2+2(gap=2)个分别有序链表按二路归并方式加到当前tail结点后面,然后更新tail...: #include using namespace std; // 数组中连续两个子序列合并为一个有序序列 void Merge(int* arr, int *tempArr,

79730

13.2 具体集合

如果链表只有很少几个元素,就完全不必担心get方法和set方法开销带来烦恼。   为什么优先使用链表?唯一理由是尽可能减少在列表中间插入或删除元素所付出代价。...排序是按照树结构来实现(在这里使用是红黑树red-black tree),每次讲一个数据添加到树中,都被放置在正确排序位置,因此,迭代器总是以排好序顺序访问每个元素。...只有两个正整数进行比较时候,才能使用上述方法进行,直接返回它们差值,如果x是一个较大正整数,y是一个绝对值较大负整数,x - y可能会溢出。   ...Java类库映射表提供了两个通用实现:HashMap和TreeMap,这两个实现了Map接口。   散列映射表对键进行散列,树映射表用键整体顺序对元素进行排序,并将其组织成搜索树。...如果对同一个键两次调用put方法,第二个值就会取代第一个值。实际上,put返回这个键参数存储一个值。

1.8K90

Java基础

,那么对这同一个对象调用多次,hashCode方法必须始终如一地返回同一个整数 如果两个对象通过equals方法比较得到结果是相等,那么对这两个对象进行hashCode得到应该相同 两个不同对象...它是HashMap子类,在HashMap数据结构基础,还维护着一个双向链表链接所有元素,这个链表定义了迭代顺序,同HashMap一样,key只可以有一个null,value可以有多个null 支持两种排序...数据结构里删除,同时将其从链表里面删除 TreeMap LinkedHashMap虽然可以根据插入顺序和访问顺序排序,但是无法自定义排序规则,TreeMap可以 实现基于红黑树,key不能为null,...,无序,可以存null 对于添加到HashSet中元素,需要重写hashCode和equals方法 在添加一个元素时候,实际上将该元素作为HashMap中key,所有元素值,其实是一个final...假如我们某个ThreadLocal对象引用设置null,但线程中threadLocals属性还指向了那个ThreadLocalMap对象,即存在一条强引用.

57610

Java集合框架

()返回nullremove()会抛出一个异常。...,本质是LinkedHashMap实现 底层数据结构由哈希表(是一个元素链表数组)和双向链表组成。...接口抽象类 在之前版本中,HashMap采用数组+链表实现,即使用链表处理冲突,同一hash值链表存储在一个链表里(和我们在之前自行实现哈希表相同)。...JDK1.8中,HashMap采用数组+链表+红黑树(一种平衡搜索二叉树)实现,当链表长度超过阈值(8)时,链表转换为红黑树,这样大大减少了查找时间 和Vector类似,Map体系也有一个自JDK1.2...,发现它只有一个构造函数和一个 get() 方法,而且它 get() 方法仅仅是返回一个null,也就是说永远无法通过虚引用来获取对象,虚引用必须要和 ReferenceQueue 引用队列一起使用

1.3K10

数据结构、算法与应用 习题6.1 p124

重载[] 复杂度O(n) 实际上重载应该包含两种,分别是提供左值,右值返回。...左移元素 leftShift 对于链表来说,左移实际上就是从左侧开始删除n个元素。并将首元素链接到最后删除位置一个元素。当n大于size()时候,应该是空链表。或者抛出索引错误。...直到末元素,末元素prev设置header,或者首元素next设置rear。...插入排序遍历复杂度是O(n),每一次取到一个元素,需要在前置序列中找到一个合适位置,这个查找过程复杂度渐进来说也是O(n),所以最坏复杂度是O(n²) n²/2 最好情况复杂度实际上刚好是逆序...选择排序 实际上和上面已经重复了,在我自己理解中,冒泡排序和和选择排序没有什么本质区别。 因为本质他们都是每一轮最后一个元素归位,属于减治之。

26030

前端算法系统练习: 链表篇完结

那在实现应该注意一些什么问题呢? 保存后续节点。作为新手来说,很容易当前节点 next指针直接指向前一个节点,但其实当前节点下一个节点指针也就丢失了。...由③式,慢指针走了(m - n) * S - Y个单位,以环起点参照物,相遇时位置 Y,现在由Y + (m - n) * S - Y即(m - n) * S,得知慢指针实际上参照环起点,走了整整...; }; 链表合并 No.1 合并两个有序链表 两个有序链表合并为一个有序链表并返回。...在这里需要提醒大家是,在自下而上实现方式中,我一个链表绑定了一个虚拟头指针(dummyHead),为什么这么做?...两个条件,在奇数情况下,总是 fast空先出现,偶数情况下,总是fast.next先出现.

33410

java集合详解完整版(超详细)「建议收藏」

内存空间占用: ArrayList空 间浪费主要体现在在list列表结尾会预留一定容量空间,LinkedList空间花费则体现在它一个元素需要消耗比ArrayList更多空间(因为要存放直接后继和直接前驱以及数据...TreeSet支持两种排序方式,自然排序 和定制排序,其中自然排序默认排序方式。向 TreeSet中加入应该是同一个对象。...另外,HashTable 基本被淘汰,不要在代码中使用它; 对Null key 和Null value支持: HashMap 中,null 可以作为键,这样只有一个,可以有一个或多个键所对应...也就是说 HashMap 总是使用2幂作为哈希表大小,后面会介绍到为什么是2幂次方。...接口实际上是出自 java.util 包它有一个compare(Object obj1, Object obj2)方法用来排序 Map类似,是一种数组和链表结构,一个 Segment 包含一个 HashEntry

80120

彻底理解HashMap及LinkedHashMap

实际上,经典HashMap就是一个链表数组,只是jdk1.8再次对经典hashMap数据结构作了小幅调整,如下是当前HaspMap数据结构: ?...在JDK1.6和JDK1.7中,HashMap采用数组+链表实现,即使用链表处理冲突,同一hash值key-value键值对存储在一个链表里。...最理想效果是,Node数组中每个位置只有一个元素,这样,查询时候效率最高,不需要遍历单链表,也不需要通过equals去比较Key,而且空间利用率最大。 那如何计算才会分布最均匀呢?...类似于一小节为什么HashMap中数组长度总是取2整数次幂。...1.7 HashMap线程不安全 所有人知道HashMap是线程不安全,我们应该使用ConcurrentHashMap。但是为什么HashMap是线程不安全呢?

1K40

Java集合框架常见面试题

内存空间占用: ArrayList 空 间浪费主要体现在在 list 列表结尾会预留一定容量空间, LinkedList 空间花费则体现在它一个元素需要消耗比 ArrayList 更多空间...为什么呢?我觉得还是和底层数据结构有关!ArrayList 底层是数组, LinkedList 底层是链表。数组天然支持随机访问,时间复杂度 O(1),所以称为快速随机访问。...obj)方法用来排序 comparator接口实际上是出自 java.util 包它有一个compare(Object obj1, Object obj2)方法用来排序 一般我们需要对一个集合使用自定义排序时...,不是转换为红黑树)时,链表转化为红黑树,以减少搜索时间。...这也就解释了 HashMap 长度为什么是 2 幂次方。 这个算法应该如何设计呢? 我们首先可能会想到采用%取余操作来实现

60321

最全集合干货送给大家

HashSet 类 HashSet 类是 Set 接口实现类,由哈希表支持(实际上 HashSet 是 HashMap 一个实例)。...一个优先级队列不允许 null 元素依赖于自然排序优先级队列也不允许插入不可比较对象(这样做可能导致 ClassCastException )。 队列头在某种意义是指定顺序最后一个元素。...list 迭代器 set 方法,对于可变大小列表,程序员应该额外实现迭代器 r emove 方法 和 add 方法 LinkedList 类 LinkedList 是一个双向链表实现了所有 List...它主要特性如下: LinkedList 所有的操作都可以表现为双向性,索引到链表操作遍历从头到尾,视哪个距离近遍历顺序。...一般用途 map 实现应该提供两个标准构造器:一个空 map 创建一个 void (无参数)构造器。和一个只有单个 Map 类型参数构造器。

61310

每日一题《剑指offer》链表篇之合并k个已排序链表

:准备双指针分别放在两个链表头,每次取出较小一个元素加入新链表,将其指针后移,继续比较,这样我们出去都是最小元素,自然就完成了排序。...既然都是归并排序思想了,那我们可不可以直接归并分治来做,不是顺序遍历合并链表呢?答案是可以! 归并排序是什么?简单来说就是一个数组每次划分成等长两部分,对两部分进行排序即是子问题。...step 2:继续不断递归划分,直到每部分链表1. step 3:划分好相邻两部分链表,按照两个有序链表合并方式合并,合并好两部分继续往上合并,直到最终合并成一个链表。...解题思路 方法一:双指针 我们知道链表不像二叉树,每个节点只有一个val值和一个next指针,也就是说一个节点只能有一个指针指向下一个节点,不能有两个指针,那这时我们就可以说一个性质:环形链表环一定在末尾...我们可以用双指针技巧,同向访问双指针,速度是快慢,只要有环,二者就会在环内不断循环,且因为有速度差异,二者一定会相遇。 具体做法: step 1:设置快慢两个指针,初始指向链表头。

15610

猫眼面经汇总

CMS垃圾收集器 类加载机制和双亲委派模型,以及为什么实现双亲委派模型 虚拟机调优参数 三、数据结构与算法 链表反转 当前节点和下一节点保存起来,然后当前节点反转。...} //如果headnull时候,pre就为最后一个节点了,但是链表已经反转完毕,pre就是反转后链表一个节点 //直接输出pre就是我们想要得到反转后链表...public ListNode ReverseList(ListNode head) { //如果链表空或者链表只有一个元素 if (head == null ||...for (int i = 0; i < array.length - 1; i++) { flag = false;//每次开始排序前,设置flag排序过...Merge Sorted Array(合并两个有序数组) * 给定两个有序整数数组 nums1 和 nums2, nums2 合并到 nums1 中,使得 num1 成为一个有序数组。

97030

JAVA面试备战(二)--集合

另外,HashTable 基本被淘汰,不要在代码中使用它; 对Null key 和Null value支持:HashMap 中,null 可以作为键,这样只有一个,可以有一个或多个键所对应...通过例子来讲解这个不安全过程,引用上一篇文章例子,首先一个长度8map,map已经存了key1、9两个值,他们都会在maptable[1]。...对于任意节点而言,其到叶子点树NULL指针每条路径包含相同数目的黑节点; 2、平衡二叉树(AVL树): 红黑树是在AVL树基础提出来。 平衡二叉树又称为AVL树,是一种特殊二叉排序树。...(从每个叶子到根路径不会有两个连续红色节点) 性质5:从任一节点到其子树中每个叶子节点路径包含相同数量黑色节点。 ConcurrentHashMap线程安全具体实现方式?...这里考查点就是扩容公式,当增加到 11 时候,此时我们希望数组大小 11,但实际上数组最大容量只有 10,不够了就需要扩容,扩容公式是:oldCapacity + (oldCapacity

47010

【剑指Offer专题】链表系列:从尾到头打印链表、反转链表、回文链表、合并两个排序链表(C++和Python实现

每经过一个结点时候,把该结点放到一个栈中。当遍历完整个链表后,再从栈顶开始逐个输出结点值,给一个链表结构,这样链表实现了反转。...使用双指针法判断是否回文。 遍历链表值复制到数组列表中。用 currentNode 指向当前节点。...在 Python 中,很容易构造一个列表反向副本,也很容易比较两个列表。因此最好使用双指针法来检查是否回文。...1、思路 先判断输入链表是否指针。如果第一个链表空,则直接返回第二个链表;如果第二个链表空,则直接返回第一个链表。如果两个链表都是空链表,合并结果是得到一个链表。...两个链表都是排序,我们只需要从头遍历链表,判断当前指针,哪个链表值小,即赋给合并链表指针即可。使用递归就可以轻松实现

82110

Java集合解惑

,当数组长度不够时,其内部会创建一个更大数组,然后原数组中数据拷贝至新数组中, LinkedList 是双向链表结构,内存不用连续,所以用多少申请多少。...HashTab 类似 HashMap,但是不允许键 null 和值 null,比 HashMap 慢,因为同步操作;HashMap 是基于散列列表实现,其键和值都可以为 null;LinkedHashMap...,查看键值对时会被排序,存入元素必须实现 Comparable 接口,但是不允许键 null,值可以为 null;如果键枚举类型可以使用专门实现类 EnumMap,它使用效率更高数组实现。...当 key null 时 HashMap 特殊处理总是放在 Entry[] 数组一个元素。...所以如果你正在编写一个值类,它具有非常明显内在排序关系,比如按字母顺序、按数值顺序或者按年代顺序,那你就应该坚决考虑实现 Comparable 这个接口, 若一个实现了 Comparable 接口就意味着该类支持排序

64320
领券