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

LinkedList delete :为什么我们不用previous覆盖head?

在删除链表节点时,通常我们会使用previous节点来删除当前节点。而不使用head节点来覆盖previous节点的原因如下:

  1. 链表的删除操作需要保持链表的连续性。如果我们直接使用head节点来覆盖previous节点,那么在删除节点后,链表的连续性将会被破坏。因为head节点是链表的起始节点,直接覆盖会导致链表的头部丢失,无法继续访问链表的其他节点。
  2. 使用previous节点来删除当前节点可以保持链表的完整性。通过将previous节点的next指针指向当前节点的下一个节点,可以将当前节点从链表中移除,而不会破坏链表的连续性。这样可以确保链表的其他节点仍然可以通过previous节点进行访问。

总结起来,我们不使用previous节点覆盖head节点的原因是为了保持链表的连续性和完整性。通过使用previous节点来删除当前节点,可以确保链表的其他节点仍然可以被正确访问。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 重读《学习JavaScript数据结构与算法-第三版》- 第6章 链表(一)

    链表 链表,为什么要有这种数据结构呢?当然,事出必有因! 数组-最常用、最方便的数据结构,But,当我们从数组的起点或中间插入或移动项的成本很高,因为我们需要移动数组元素。...实现链表 我们要实现链表的结构以及对应的方法,大致为:元素插入、移除、获取链表长度、查询元素、是否为空等等...更详细可看代码实现逻辑。...node.next = current this.head = node } else { // 查找到指定索引位置的前一个元素 let previous = this.getElementAt...() 移除指定索引位置的元素 实现逻辑:判断是否为链表第一项,若为第一项,则将this.head指向第二个元素即可;如果不是第一项,则获取索引index位置的上一位置索引元素previous,以及下一位置索引元素.../* LinkedList { count: 2, head: Node { element: 15, next: Node { element

    43010

    「数据结构与算法Javascript描述」链表

    为什么需要链表 在很多编程语言中,数组的长度是固定 的,所以当数组已被数据填满时,再要加入新的元素就会非常困难。...下图演示了从链表中删除“bacon”的过程: image-20220125203236829 链表还有其他一些操作,但插入和删除元素最能说明链表为什么如此有用。 3....设计一个基于对象的链表 我们设计的链表包含两个类。Node 类用来表示节点,LinkedList 类提供了插入节点、删除节点、显示列表元素的方法,以及其他一些辅助方法。...该类也有一个构造函数,使用一个 Node 对象来保存该链表的头节点: function LinkedList() { this.head = new Node('head'); } head 节点的...创建循环链表,只需要修改 LinkedList类的构造函数: function LinkedList() { this.head = new Node('head'); this.head.next

    84720

    Java 集合系列08: List总结(LinkedList, ArrayList等使用场景和性能分析)

    概要 前面,我们学完了List的全部内容(ArrayList, LinkedList, Vector, Stack)。 第1部分 List概括 先回顾一下List的框架图 ?...ms LinkedList : delete elements from the st position use time: ms ArrayList : delete elements from...第3部分 LinkedList和ArrayList性能差异分析 下面我们看看为什么LinkedList中插入元素很快,而ArrayList中插入元素很慢!...通过上面的分析,我们就能理解为什么LinkedList中插入元素很快,而ArrayList中插入元素很慢。 “删除元素”与“插入元素”的原理类似,这里就不再过多说明。...接下来,我们看看 “为什么LinkedList中随机访问很慢,而ArrayList中随机访问很快”。

    69751

    LinkedList浅析

    我们平常使用的list是一样的,理论上来说一种list就可以完成我们所有的需求。但是它们在运行过程中有区别的,完成需求所需要的资源也不相同,至于什么情况下使用哪种list就看需求和当前情况了。...LinkedList 实现了Cloneable接口,即覆盖了函数clone(),能克隆。...Entry中包含成员变量: previous, next, element。其中,previous是该节点的上一个节点,next是该节点的下一个节点,element是该节点所包含的值。   ...双向链表结构 双链表(双向链表):双链表和单链表相比,多了一个指向尾指针(tail),双链表的每个结点都有一个头指针head和尾指针tail,双链表相比单链表更容易操作,双链表结点的首结点的head指向为...若要实现不可修改的列表,则需要实现列表迭代器的 hasNext、next、hasPrevious、previous 和 index 方法即可。

    47010

    Java集合详解2:一文读懂Queue和LinkedList

    源码分析 定义 首先我们先看LinkedList的定义: public class LinkedList extends AbstractSequentialList implements...List, Deque, Cloneable, java.io.Serializable 从这段代码中我们可以清晰地看出LinkedList继承AbstractSequentialList...this.next = next; this.previous = previous; } } 上面为Entry对象的源代码,Entry为LinkedList的内部类,它定义了存储的元素...; } return e; } 从该方法有两个遍历方向中我们也可以看出LinkedList是双向链表,这也是在构造方法中为什么需要将header的前...如果对数据结构有点了解,对上面所涉及的内容应该问题,我们只需要清楚一点:LinkedList是双向链表,其余都迎刃而解。 由于篇幅有限,下面将就LinkedList中几个常用的方法进行源码分析。

    1.1K00

    LinkedList和Queue

    - Java集合类 今天我们来探索一下LinkedList和Queue,以及Stack的源码。 本文参考 http://cmsblogs.com/?...源码分析 定义 首先我们先看LinkedList的定义: public class LinkedList extends AbstractSequentialList implements...List, Deque, Cloneable, java.io.Serializable 从这段代码中我们可以清晰地看出LinkedList继承AbstractSequentialList...; } return e; } 从该方法有两个遍历方向中我们也可以看出LinkedList是双向链表,这也是在构造方法中为什么需要将header的前、后节点均指向自己...如果对数据结构有点了解,对上面所涉及的内容应该问题,我们只需要清楚一点:LinkedList是双向链表,其余都迎刃而解。 由于篇幅有限,下面将就LinkedList中几个常用的方法进行源码分析。

    46410

    TypeScript 实战算法系列(三):实现链表与变相链表

    // 链表不为空,我们只能拿到链表中第一个元素的引用 current = this.head; // 循环访问链表 while (...编写测试代码 链表实现后,接下来我们来测试下链表中的每个函数是否正常工作 const linkedList = new LinkedList(); linkedList.push(12); linkedList.push...(13); linkedList.push(14); linkedList.push(15); linkedList.push(16); linkedList.push(17); linkedList.push...实现代码 我们捋清思路后,将上述思路转化为代码 新建CircularLinkedList.ts文件,用于实现循环链表类 声明CircularLinkedList类并继承LinkedList export...,接下来我们将上述思路转化为代码: 新建OrderedList.ts文件,用于实现有序链表 声明OrderedList类,继承LinkedList类 export default class OrderedList

    1.8K10

    TypeScript实现链表与变相链表

    // 链表不为空,我们只能拿到链表中第一个元素的引用 current = this.head; // 循环访问链表 while (...编写测试代码 链表实现后,接下来我们来测试下链表中的每个函数是否正常工作 const linkedList = new LinkedList(); linkedList.push(12); linkedList.push...(13); linkedList.push(14); linkedList.push(15); linkedList.push(16); linkedList.push(17); linkedList.push...实现代码 我们捋清思路后,将上述思路转化为代码 新建CircularLinkedList.ts文件,用于实现循环链表类 声明CircularLinkedList类并继承LinkedList export...,接下来我们将上述思路转化为代码: 新建OrderedList.ts文件,用于实现有序链表 声明OrderedList类,继承LinkedList类 export default class OrderedList

    94920

    从 LRU Cache 带你看面试的本质

    技术面试究竟在考什么 在人人都知道刷题的今天,面试官也都知道大家会刷题准备面试,代码大家都会写,那面试为什么还在考这些题?那为什么有些人代码写出来了还挂了?...这个算法其实很高效,但是耗资源,所以一般不用。 LRU (Least Recently Used) 这是目前最常用了。...但是删除时我还需要一个 previous pointer 才能删掉,所以我需要一个 Doubly LinkedList. ?...那我们就先假设这两个数据结构存的都是 ,然后来看这些操作,如果都很顺利,那没问题,如果有问题,我们再调整。 那现在我们的 HashMap 和 LinkedList 长这样: ?...之后我们更新、移动每个 node 时,它的 reference 也不需要变,所以 HashMap 也不用改动,动的只是 previous, next pointer.

    47331

    趣味算法:JS实现红绳算法(匹配合适的另一半)

    分析这个数据的意义 城市:留下数据者的所在城市,但是现在车、马、书信都很快,所以这并不是我们用来界定男女是否匹配的依据,只能说是有特殊需求,例如不接受异地恋的这种就匹配,本次我们不考虑 数字:就算是幸运数字吧...会被覆盖掉。我们不允许出现这个问题.因为我们要把所有人的信息都存进去,今天介绍两种方法: 分离链接 线性探测 ? (一)线性探测法 线性探测法是最简单的处理冲突的方法。...let previous, index = 0 if (position === 0) { // 移除第一项 head = current.next...current = current.next } previous.next = current.next // 将previous与current...node.next = current // 在previous与current的下一项之间插入node previous.next = node }

    69320
    领券