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

链表反转(递归和非递归方式)正确姿势

1、非递归(迭代)方式 迭代方式是从链头开始处理,如下图给定一个存放5个数链表。...此处需要注意,不可以上来立即将上图中P->next直接指向NewH,这样存放2地址就会被丢弃,后续链表保存数据随之无法访问。...然后再让P->next指向NewH,最后P=tmp就可以取回原链表数据了,所有循环访问可以继续展开下去。 指针继续向后移动,直到P指针指向NULL停止迭代。...最后一步: 2、递归方式 我们再来看看递归实现链表翻转实现,前面非递归方式是从前面数1开始往后依次处理,而递归方式则恰恰相反,先循环找到最后面指向数5,然后从5开始处理依次翻转整个链表。...首先指针H迭代到底如下图所示,并且设置一个新指针作为翻转后链表头。由于整个链表翻转之后头就是最后一个数,所以整个过程NewH指针一直指向存放5地址空间。

1.2K20

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

Leetcode -147.对链表进行插入排序 题目: 给定单个链表头 head ,使用 插入排序 对链表进行排序,并返回 排序后链表头 。...改变它们相对位置,还要保持原链表相对位置不变; 假设链表值为:5->3->1->4->2->NULL 第一次迭代: 第一次迭代排序好链表: 第二次迭代: 第二次迭代排序好链表...即可 return dummy->next; } Leetcode - 237.删除链表节点 有一个单链表 head,我们想删除其中一个节点 node。...给你一个需要删除节点 node 。你将 无法访问 第一个节点 head。 链表所有值都是 唯一,并且保证给定节点 node 不是链表最后一个节点。 删除给定节点。...注意,删除节点并不是指从内存中删除。这里意思是: 给定节点值不应该存在于链表中。 链表节点数应该减少 1。 node 前面的所有值顺序相同。 node 后面的所有值顺序相同。

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

Java 学习笔记(10)——容器

使用迭代器可以操作元素本身,可以根据当前元素寻找到下一个元素,常用方法有: boolean hasNext() : 当前迭代器指向位置是否有下一个元素 E next(): 获取下一个元素并返回。...,遍历key集合并通过get方法获取value 获取键值对组成一个集合,遍历这个新集合来得到键值对值 针对第一种方法,Map中有一个 keySet() 方法。...从JDK1.5 以后引入了for each写法,使Java能够直接使用for迭代,而不用手工使用迭代器来进行迭代。 for (T t: set); 上述是简单写法。...each写法主要是为了简化迭代写法,它在底层仍然采用迭代方式来遍历,针对向Map这样无法直接使用迭代结构来说,自然无法使用这种简化写法,针对Map来说需要使用上述两种遍历方式中一种,...但是使用多态一个缺点是无法使用元素对象特有方法

67350

从TypeScript入手,驾驭HarmonyOS开发技术风潮!-----------(中篇)

extends 关键字), 类和接口之间叫实现 (使用是 implements) })() 总结: 类可以通过接口方式,来定义当前这个类类型 类可以实现一个接口,类可以实现多个接口,需要注意是...private 修饰符, 类中成员如果使用private 来修饰, 外部是无法访问这个成员数据, 子类中也是无法访问该成员数据....修饰符, 类中成员如果使用private 来修饰, 外部是无法访问这个成员数据, 子类中也是无法访问该成员数据. // protected 修饰符, 类中成员如果使用protected来修饰,...console.log(person.name); person.sayHi('赵丽颖') })() private 修饰符 外部无法访问类中私有属性 子类中也无法访问类中私有属性.../common/bean/NewsData'; 迭代器 for…of会遍历可迭代对象,调用对象上Symbol.iterator方法

11210

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

left : right; //处理剩余部分 } 那上述merge空间复杂度是O(1)还是O(logn)呢?其实不太确定,因为递归函数栈确实是logn,这个算不算空间复杂度也是众说纷纭。...那不符合要求并不代表归并排序不行,因为递归只是算法特定实现方式而已,我们可以使用迭代来实现链表归并排序。...a[i++], a[j]);//已处理区间多了一个元素,右边界增加1 ++j; } swap(a[low], a[i-1]); return i-1; } 为什么要强调第二种叫不上名字方法以及以开头为...所以我们需要第二种方法,因为一直在从前往后遍历,而且最好是以链表开头作为pivot,因为没法以链表结尾作为pivot(需要遍历到末尾)。那么现在我们就可以对链表进行partition了。...partition函数逻辑和上一个处理数组逻辑是一样,细节上略有差别,主要因为: 处理数组,可以访问到a[i-1],也就是边界前一个元素 而链表无法访问到上一个节点 class Solution

66910

Java 集合框架体系总览

2)数组拥有 length 属性,可以通过这个属性查到数组存储能力也就是数组长度,但是无法通过一个属性直接获取到数组中实际存储元素数量。...❝至于为什么要定义一个方法签名完全相同接口,理解是为了让集合框架结构更加清晰,将单列集合从以下两点区分开来: 可以添加重复元素(List)和不可以添加重复元素(Set) 可以通过整数索引访问(...JDK1.8 以后在解决哈希冲突时有了较大变化,当链表长度大于阈值(默认为 8)时,将链表转化为红黑树,以减少搜索时间(注意:将链表转换成红黑树前会判断,如果当前数组长度小于 64,那么会选择先进行数组扩容...LinkedHashMap 继承自 HashMap,所以底层仍然是基于拉链式散列结构,即由数组和链表或红黑树组成。...另外,LinkedHashMap 在上面结构基础上,增加了一条双向链表,使得上面的结构可以保持键值对插入顺序。同时通过链表进行相应操作,实现了访问顺序相关逻辑。

1.5K21

实现一个线程安全且迭代器可以保存链表

但是实现没法满足上面提到需求。...一个重要原因是 std::collections::LinkedList 遵循 Rust 借用和可变借用规则,另一方面也是由于实现是尽可能没有额外开销。...这时候直到我释放这个 CursorMut 前,对链表其他操作都无法进行。所以就不能把这个游标保存起来以后用。那可不可以包一层 RefCell 来运行时借用,然后只用不可变 Cursor 呢?...其实也是不可以,因为首先 Cursor 和迭代器一样没有提供修改链表本身接口,另一方面持有 Cursor 会导致容器本身不能使用mutable接口,也就无法完成增删链表节点操作。...包括标准库实现里 Iter 和 Cursor 里都存了 len 和提供方法获取后续有多少可用元素都是依赖与此。但是我们这里分离了迭代器和容器生命周期,就不能简单地这么声明了。

1.2K20

什么是链表

如上图所示就是链表概念图,Blue、Yellow、Red 这 3 个字符串作为数据被存储于链表中,也就是数据域,每个数据都有 1 个指针,即指针域,指向下一个数据内存地址,其中 Red 是最后 1...这时,只需要把 Green 指针指向位置从 Yellow 变成 Red,删除就完成了。虽然 Yellow 本身还存储在内存中,但是不管从哪里都无法访问这个数据,所以也就没有特意去删除必要了。...虽然上文中提到链表在尾部没有指针,但我们可以在链表尾部使用指针,并且让指向链表头部数据,将链表变成环形,这便是循环链表叫环形链表。...总结 看完之后,相信大家都对链表链表基本操作有了一定了解,还对循环链表和双向链表有了初步认识,大家可以使用自己喜欢语言去设计实现下单向链表,有能力的话可以把循环链表和双向链表实现下。...说完链表,当然不能忘记经常和链表同时出现在面试官口中—数组,将在接下来文章对其进行展开介绍。 参考 《第一本算法书》

65531

实现一个线程安全且迭代器可以保存链表

一个重要原因是 std::collections::LinkedList 遵循 Rust 借用和可变借用规则,另一方面也是由于实现是尽可能没有额外开销。...这时候直到我释放这个 CursorMut 前,对链表其他操作都无法进行。所以就不能把这个游标保存起来以后用。那可不可以包一层 RefCell 来运行时借用,然后只用不可变 Cursor 呢?...其实也是不可以,因为首先 Cursor 和迭代器一样没有提供修改链表本身接口,另一方面持有 Cursor 会导致容器本身不能使用mutable接口,也就无法完成增删链表节点操作。...对链表节点 mutable 操作其实已经在链表接口那一层,通过 Rust 自带借用管理控制了,不会发生冲突。...不想多去造这个轮子,没啥意义,所以这个去除锁操作还是等这个特性stable了,再来优化吧。

62620

老哥,您看我这篇Java集合,还有机会评优吗?

迭代进行遍历 等等,这一章还没完,还有一个ListIterator。...ListIterator 存在于 List 集合之中,通过调用方法可以返回起始下标为 index迭代器 List list = new ArrayList(); // 返回下标为...HashTable 底层采用 数组+链表 存储键值对,由于被弃用,后人也没有对进行任何改进 HashTable 默认长度为 11,负载因子为 0.75F,即元素个数达到数组长度 75% 时,会进行一次扩容...Queue接口定义了该类集合是以队列作为存储结构,所以集合内部元素有序排列,仅可以操作头结点元素,无法访问队列中间元素。...Deque 接口额外提供了针对队列头结点和尾结点操作方法,而插入、删除方法同样提供了两套不同失败策略。

54010

java集合介绍_java代码分析框架

此外,他子类 KeyIterator,ValueIterator,EntryIterator 非常朴素,只在基础上重写包装了一下 nextNode()作为自己 next()方法,这里不妨看成适配器一种...– 知乎; 这里简单概括一下: 该方法实际上是一个“扰动函数”,作用是对Object.hashCode()获取到 hash 值进行高低位混淆。...所以,在 HashMap 中,三种视图集合都可以通过迭代器或增强 for 循环迭代器,但是 HashMap 本身虽然有迭代器,但是由于没有 iterator()方法,所以无法通过迭代器或者增强 for...迭代 HashMap 本身有迭代器 HashIterator,但是没有 iterator()方法,所以无法直接通过增强 for 循环或者获取迭代进行迭代,只能借助三个视图集合迭代器或增强 for 来迭代器...HashMap 实现了 fast-fail 机制,因此最好不要在迭代时候进行结构性操作。

73930

C语言 | 链表概述

“要成为绝世高手,并非一朝一夕,除非是天生武学奇才,但是这种人…万中无一” ——包租婆 这道理放在C语言学习上一并受用。...有故事,你有酒么? C语言链表概述 链表是一种常见重要数据结构。它是动态地进行存储分配一种结构,是根据需要开辟内存单元。 链表有一个“头指针”变量,存放一个地址,该地址指向一个元素。...链表中每一个元素称为“结点”,每个结点都应包括两个部分 用户需要实际数据。 下一个结点地址。 链表中各元素在内存中地址可以是不连续。...要找某一元素,必须先找到上一个元素,根据提供下一元素地址才能找到下一个元素。如果不提供“头指针”,则整个链表无法访问链表如同一条铁链一样,一环扣一环,中间是不能断开。...链表这种数据结构,必须利用指针变量才能实现,即一个结点中应包含一个指针变量,用它存放下一结点地址。

1.2K30

图解链表

Blue、Yellow、Red 这3个字符串作为数据被存储于链表中。每个数据都有1个“指针”,指向下一个数据内存地址。 ? 在链表中,数据一般都是分散存储于内存中,无须存储在连续空间内。 ?...这时,只需要把 Green 指针指向位置从 Yellow 变成 Red,删除就完成了。虽然 Yellow 本身还存储在内存中,但是不管从哪里都无法访问这个数据,所以也就没有特意去删除必要了。...如果已经到达了添加数据位置,那么添加操作只需花费 ? 时间。删除数据同样只需 ? 时间。 补充说明 上文中讲述链表是最基本一种链表。除此之外,还存在几种扩展方便链表。...虽然上文中提到链表在尾部没有指针,但我们可以在链表尾部使用指针,并且让指向链表头部数据,将链表变成环形。这便是“循环链表”,叫“环形链表”。循环链表没有头和尾概念。...摘自:《第一本算法》

32940

深入浅出LinkedHashMap原理和源码解毒

本来无序数组 + 链表结构,通过 before 和 after 把它们关联起来,变有序。在 put 和 get 时候维护好了这个双向链表,遍历时候就有序了。...afterNodeAccess 方法埋下了隐患,会修改 modCount,因此当你正在 accessOrder=true 模式下,迭代 LinkedHashMap 时,如果同时查询访问数据,会导致 ...LinkedHashMap 相对于 HashMap 源码比,是很简单。因为大树底下好乘凉。继承了 HashMap,仅重写了几个方法,以改变迭代遍历时顺序。...会导致 fail-fast,因为迭代顺序已经改变。...nextNode() 就是迭代器里next()方法。 该方法实现可以看出,迭代 LinkedHashMap,就是从内部维护链表表头开始循环输出。

91730

「算法与数据结构」JavaScript中链表

,同时录制了视频,文末有链接,那么我们来开始学习链表,GO!...等等这些好用方法我们链表必须得有啊,我们先仔细构思下要给链表添加哪些实用特性或者说方法,先搭一个基础骨架,这里列出了很多,我们来一一实现下,欢迎补充 // 向链表中追加节点 LinkedList.prototype.append...getElementAt 方法以及通过节点值获取链表元素即 find 方法,因为后面要多次用到它们,我们先说 getElementAt 方法,上面我们说想要找一个元素,我们必须从头迭代,所以我们直接根据传入索引进行迭代即可...getElementAt 方法是类似的,getElementAt 方法可以优化,那么 find 再变成双向链表可优化,我们想,既然双向都可以进行迭代,那么我们两边同时迭代岂不是更快,双向迭代情况下...这个方法在更新时候是进行递归操作,如果在更新过程中有大量节点需要更新,就会出现长时间占用 JS 主线程情况,并且整个递归过程是无法被打断,由于 JS 线程和 GUI 线程是互斥(详看「硬核

86110

【C++】使用哈希表模拟实现STL中unordered_set和unordered_map

哈希表迭代实现 接着我们来实现一下哈希表迭代器 我们来思考一下迭代器应该怎么搞: 那按照我们以往经验,迭代器应该还是对结点指针封装,然后顺着每个不为空哈希桶(链表进行遍历就行了。...我们来解决一下: 第一个迭代类里面无法访问私有成员_table 那解决方法呢我们可以写Get方法,当然这里可以用友元解决。 那我们用一下友元吧 然后再运行 就可以了。...: 但是这里类外无法访问date私有成员,那我们还用友元解决吧 然后我们可以用个BKDR哈希 然后我们再运行 会发现这里又有一个报错。...那首先我们得实现一下const迭代器: 先得给哈希表实现一下,还是之前方法通过增加两个模板参数 然后const版本begin和end: 那然后我们把set迭代器重新封装一下: 然后再运行:...那我们把const迭代搞一下吧: const版本begin和end: 来试一下: ,我们看到普通迭代器可以修改value key是不行

12010

java集合源码分析(四):LinkedList「建议收藏」

大家好,又见面了,是你们朋友全栈君。 概述 LinkedList 是一个不保证线程安全、基于双向双端链表实现 List 集合。...但是和 ArrayList 或者 Vector 相比,因为它是链表,所以无法像数组那样通过下标快速随机访问,故而没有实现 RandomAccess 接口。...“不必要”,但是: 1.如果被丢弃节点驻留在多个代中,那么这样有助于分代 GC; 2.如果存在可访问迭代器,不妨碍释放内存; 对这段话,是这么理解: 有些节点可能被多次访问,有些则很少被访问...ArrayList 那样直接随机通过索引去访问元素,每一次获取迭代器或者节点,都需要通过 node()方法遍历整个链表。...LinkedList 实现了 Deque 接口,因此可以把当成队列或者栈使用。实际上,他提供了对应同名方法

37220

深入浅出Java中数据结构:LinkedHashMap详解

是一名后端开发爱好者,工作日常接触到最多就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会通过文章形式进行输出,希望以这种方式帮助到更多初学者或者想入门小伙伴们,同时能对自己技术进行沉淀...源代码解析   LinkedHashMap源代码比HashMap源代码要复杂一些,因为需要维护一个双向链表。...下面我们将对LinkedHashMap源代码进行分析,帮助读者更好地理解实现原理。...优缺点分析 LinkedHashMap相对于HashMap优点在于: 可以按照插入顺序和访问顺序迭代元素。 通过维护一个双向链表,可以实现LRU缓存等有序存储和访问场景。...测试代码分析   根据如上测试用例,在此给大家进行深入详细解读一下测试代码,以便于更多同学能够理解并加深印象。

40451

Java基础

,那么对这同一个对象调用多次,hashCode方法必须始终如一地返回同一个整数 如果两个对象通过equals方法比较得到结果是相等,那么对这两个对象进行hashCode得到值应该相同 两个不同对象...即通过get方法访问元素,会放到链表尾部,也就是按照了访问时间进行排序,基于这个特性和 添加元素:先添加到HashMap数据结构里,然后维护双向链表关系,添加到链表尾部 删除元素:先从HashMap...如果为null没法比较,value可以为null 实现了Cloneable接口,所以它可以被克隆 默认情况下,根据其key自然顺序进行排序,这时候通过key#compareTo方法进行比较,此种情况key...必须实现Comparable接口;或者根据创建映射时提供Comparator进行排序 基本操作containsKey、get、put、remove方法时间复杂度是O(log(n)) HashTable...key不能为null,value不能为null 线程安全,通过synchronized实现,效率低 hash冲突时,插入链表头部 ConcurrentHashMap key不能为null,value

57710

Java集合面试题

大家好,又见面了,是你们朋友全栈君。 Java集合面试题 Java 集合框架基础接口有哪些? Collection ,为集合层级根接口。一个集合代表一组对象,这些对象即为元素。...另外,LinkedHashMap 在上面结构基础上,增加了一条双向链表,使得上面的结构可以保持键值对插入顺序。同时通过链表进行相应操作,实现了访问顺序相关逻辑。...什么是迭代器(Iterator)? Iterator 接口,提供了很多对集合元素进行迭代方法。每一个集合类都包含了可以返回迭代器实例迭代方法。...迭代器可以在迭代过程中删除底层集合元素,但是不可以直接调用集合 #remove(Object Obj) 方法删除,可以通过迭代 #remove() 方法删除。 ?...另外 List 支持 for 循环,也就是通过下标来遍历,可以用迭代器,但是 Set 只能用迭代,因为他无序,无法用下标来取得想要值。

51120
领券