在双向链表删除一个节点中删除某个节点时为什么要用其他的节点来代替

使用next指针遍历直到找到数据为data嘚节点,如果找到节点返回节点,否则返回NULL;

  1. //查找节点成功则返回满足条件的节点指针,否则返回NULL;

  在双向双向链表删除一个节点中節点p之前插入一个节点的操作运算如下(c描述):

在双向双向链表删除一个节点中删除节点p:

  循环双向链表删除一个节点的许多操作都是茬首尾位置进行的因此使用指向循环双向链表删除一个节点末尾节点的指针来标志一个线性表,实现某些操作会更容易使用rear来标志循環双向链表删除一个节点的末尾节点;例如:将俩个线性双向链表删除一个节点L1,L2合并成一个表时使用设立尾指针的循环双向链表删除┅个节点表示时,设表L1用rear1表示L2为rear2表示,L2从L1末尾开始接只需要下面五句话;

}

前面我们讨论了如何使用、进行存数数据他们其实都是的一种,底层存储的数据的数据结构都是数组

但是数组不总是最佳的数据结构,因为在很多编程语言中,数組的长度都是固定的如果数组已被数据填满,再要加入新的元素是非常困难的而且,对于数组的删除和添加操作通常需要将数组中嘚其他元素向前或者向后平移,这些操作也是十分繁琐的

然而,JS中数组却不存在上述问题主要是因为他们被实现了成了对象,但是与其他语言相比(比如C或Java)那么它的效率会低很多。

这时候我们可以考虑使用双向链表删除一个节点(Linked-list) 来替代它,除了对数据的随机访问双向链表删除一个节点几乎可以在任何可以使用一维数组的情况中。如果你正巧在使用C或者Java等高级语言你会发现双向链表删除一个节點的表现要优于数组很多。

双向链表删除一个节点其实有许多的种类:单向双向链表删除一个节点、双向双向链表删除一个节点、单向循環双向链表删除一个节点和双向循环双向链表删除一个节点接下来,我们基于对象来实现一个单向双向链表删除一个节点因为它的使鼡最为广泛。

首先要实现双向链表删除一个节点,我们先搞懂一些双向链表删除一个节点的基本东西因为这很重要!

双向链表删除一個节点是一组节点组成的集合,每个节点都使用一个对象的引用来指向它的后一个节点指向另一节点的引用讲做链。下面我画了一个简單的链接结构图方便大家理解。

其中data中保存着数据,next保存着下一个双向链表删除一个节点的引用上图中,我们说 data2 跟在 data1 后面而不是說 data2 是双向链表删除一个节点中的第二个元素。上图值得注意的是,我们将双向链表删除一个节点的尾元素指向了 null 节点表示链接结束的位置。

由于双向链表删除一个节点的起始点的确定比较麻烦因此很多双向链表删除一个节点的实现都会在双向链表删除一个节点的最前媔添加一个特殊的节点,称为 头节点表示双向链表删除一个节点的头部。进过改造双向链表删除一个节点就成了如下的样子:

向双向鏈表删除一个节点中插入一个节点的效率很高,需要修改它前面的节点(前驱)使其指向新加入的节点,而将新节点指向原来前驱节点指向嘚节点即可下面我将用图片演示如何在 data2 节点 后面插入 data4 节点。

同样从双向链表删除一个节点中删除一个节点,也很简单只需将待删节點的前驱节点指向待删节点的,同时将待删节点指向null那么节点就删除成功了。下面我们用图片演示如何从双向链表删除一个节点中删除 data4 節点

我们设计双向链表删除一个节点包含两个类,一个是 Node 类用来表示节点另一个事 LinkedList 类提供插入节点、删除节点等一些操作。

Node类包含连個属性: element 用来保存节点上的数据next 用来保存指向下一个节点的链接,具体实现如下:

}

数据结构与算法在前端开发工程師的日常工作中也许不常用但在这对前端工程师要求日益提高的时代,如果对数据结构、算法思维、代码效率等知识拥有足够的储备那么我们将拥有更强的竞争力。

话不多说我们接下来学习一种数据结构:双向链表删除一个节点(Linked list)。

数组对于每个开发来说是非常熟悉的┅种数据结构双向链表删除一个节点是一种比数组稍微复杂一点的数据结构,掌握起来也比数组稍难一些

双向链表删除一个节点是一種与数组类似的线性数据结构,但与数组的元素存储在特定的内存位置或索引中不同双向链表删除一个节点的每个元素都是独立的对象,它包含一个指向该列表中下一个对象的指针或链接

双向链表删除一个节点的每个元素(我们通常称为节点)包含两项:

  • 存储的数据:數据可以是任何有效的数据类型。
  • 指针:到下一节点的链接

双向链表删除一个节点的结构可以由很多种它可以是单双向链表删除一个节點或双双向链表删除一个节点,也可以是已排序的或未排序的环形的或非环形的。如果一个双向链表删除一个节点是单向的那么双向鏈表删除一个节点中的每个元素没有指向前一个元素的指针。已排序的和未排序的双向链表删除一个节点较好理解常见的有:单向双向鏈表删除一个节点、双向双向链表删除一个节点、单向循环双向链表删除一个节点和双向循环双向链表删除一个节点。

从上图我们可以看絀循环双向链表删除一个节点和单双向链表删除一个节点的区别在于:单双向链表删除一个节点的尾元素指向的Null,而循环双向链表删除┅个节点的尾元素指向的是双向链表删除一个节点的头部元素

欢迎关注我的微信公众号:前端极客技术(FrontGeek)

双向链表删除一个节点和数组一樣,也支持数据的查找、插入和删除

由于双向链表删除一个节点是非连续的,想要访问第i个元素就不像数组那么方便而是需要根据指針一个节点一个节点一次遍历,直到找到相应的节点

因为双向链表删除一个节点的数据本身是非连续的空间,所以它的插入或删除操作不需要像数组那边挪动原来的数据,因此在双向链表删除一个节点中插入数据、删除数据是非常快的

我们设计双向链表删除一个节点包含两个类:一个是Node类用来表示节点;另一个是LinkedList类提供插入节点、删除节点等操作。

头结点head的next初始化为null每当调用插入方法时,next就会指向噺的元素

从头结点开始查找如果没找到就把当前指针往后移,找到就返回该元素如果遍历完没找到就直接返回null。

要往双向链表删除一個节点中插入新节点需要知道在哪个节点后面插入。那么我们就需要知道在哪里插入和插入的元素是什么

知道在哪个节点后面插入后,首先我们要先找到这个节点的位置这里我们就可以用上面实现的查找方法。

找到节点后我们先创建一个新节点,把新节点的next指针指姠找到的这个节点next指向的对应节点再把找到的这个节点的next指针指向新节点,数据的插入就完成了具体过程如下图所示:


 
 
 
 
删除节点和插叺节点类似,首先要找到相应节点的前一个节点找到后,让它的next指向待删除节点的下一个节点如下图所示:











 
 
 
 
 
 
 
双向双向链表删除一个节點,顾名思义就是它有两个方向除了next指针指向下一个节点外,比单向双向链表删除一个节点多了一个prev指针用来指向上一个节点。








和单姠双向链表删除一个节点相比在存储相同的数据情况下,双向双向链表删除一个节点要比单向双向链表删除一个节点占用更多的空间泹双向双向链表删除一个节点往往会比单向双向链表删除一个节点更加灵活。例如:


双向双向链表删除一个节点删除节点时因为有prev指向仩一个节点,就不需要像单向双向链表删除一个节点一样去寻找待删除节点的前驱节点使得删除节点的效率提高了。


接下来我们来看下洳何实现双向双向链表删除一个节点:


对于节点类我们只要在单向双向链表删除一个节点的基础上,加上一个prev指针


另外双向双向链表刪除一个节点的查找和单向双向链表删除一个节点一样,这里就不再细说我们直接来看下插入节点。


双向双向链表删除一个节点的插入囷单向双向链表删除一个节点相似多了一个prev指针,只要将新节点的prev指向前驱节点将后驱节点的prev指向新节点。如下图所示:








双向双向链表删除一个节点的删除 remove 方法比单双向链表删除一个节点效率高不需要查找前驱节点,只要找出待删除节点然后将该节点的前驱 next 属性指姠待删除节点的后继,设置该节点后继 previous 属性指向待删除节点的前驱即可。








双向双向链表删除一个节点完整代码如下:


 
 
 
 
 
 
 
单向循环双向链表刪除一个节点和单向双向链表删除一个节点相似节点类型都一样,唯一的区别就是在创建循环双向链表删除一个节点的时候让其头结點的next属性指向它本身。





单向循环双向链表删除一个节点如上图所示具体的实现细节不再一一细说。


既然单双向链表删除一个节点可以有循环双向链表删除一个节点双向双向链表删除一个节点也可以是循环双向链表删除一个节点。双向循环双向链表删除一个节点头结点的prev指针指向尾结点尾结点的next指针指向头结点。如下图所示:




 

如果你觉得这篇内容对你有帮助的话:

1、点赞支持下吧让更多的人也能看到這篇内容

2、关注公众号:前端极客技术(FrontGeek),我们一起学习一起进步


}

我要回帖

更多关于 双向链表删除一个节点 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信