005-数据结构-线性结构-链表、单链表、双端链表、双向链表

一、概述

  链表是一种插入和删除都比较快的数据结构,缺点是查找比较慢。除非需要频繁的通过下标来随机访问数据,否则在很多使用数组的地方都可以用链表代替

  在链表中,每个数据项都包含在“链结点”中,一个链结点是某个类的对象。每个链结点对象中都包含一个对下一个链接点的引用,链表本身的对象中有一个字段指向第一个链结点的引用,如下图所示:

     

  在数组中,每一项占用一个特定的位置,这个位置可以用一个下标号直接访问,就像一排房子,你可以凭房间号找到其中特定的意见。在链表中,寻找一个特定元素的唯一方法就是沿着这个元素的链一直找下去,知道发现要找的那个数据项

1.1、单链表

  上述介绍其实就是基本的单链表

  

  上面展示的是一个单链表的存储原理图,head为头节点,不存放任何的数据,只是充当一个指向链表中真正存放数据的第一个节点的作用,而每个节点中都有一个next引用,指向下一个节点,就这样一节一节往下面记录,直到最后一个节点,其中的next指向null。

1.1.1、节点删除

链表的删除指定链结点,是通过将目标链结点的上一个链结点的next指针指向目标链结点的下一个链结点,示意图如下:

  

  通过这种方法,在链表的指针链中将跳过与删除的元素,达到删除的目的。不过,实际上删除掉的元素的next指针还是指向原来的下一个元素的,只是它不能再被单链表检索到而已,JVM的垃圾回收机制会在一定的时间之后回收它

1.1.2、节点添加

  添加链结点比删除复杂一点,首先我们要使插入位置之前的链结点的next指针指向目标链结点,其次还要将目标链结点的next指针指向插入位置之后的链结点。本例中的插入位置仅限于链表的第一个位置,示意图如下:

  

代码实现:data-003-link  Link

其中node是基本节点,Link是单链表实现。  

1.2、 双端链表

  双端链表与双向链表是完全不同的两个概念

  双端链表与单链表的区别在于它不只第一个链结点有引用,还对最后一个链结点有引用,如下图所示:

    

  由于有着对最后一个链结点的直接引用.所以双端链表比传统链表在某些方面要方便.比如在尾部插入一个链结点.双端链表可以进行直接操作

  但传统链表只能通过next节点循环找到最后链结点操作.所以双端链表适合制造队列.

  双端链表可以插入表尾,但是仍然不能方便的删除表尾,因为我们没有方法快捷地获取倒数第二个链结点,双端链表没有逆向的指针,这一点就要靠双向链表来解决了

代码实现:data-003-link  DoubleEndLink

1.3、双向链表

  传统链表存在着一个潜在的问题,就是没有反向引用,由上一个链结点跳到下一个链结点很容易,而从下一个链结点跳到上一个链结点很困难

  双向链表提供了这种能力,即允许向前遍历,也允许向后遍历。实现这种特性的关键在于每个链结点既有下一个链结点的引用,也有上一个链结点的引用,如下图所示:

  

1.3.1、插入操作

双向链表的插入和删除会变得更复杂,因为同时要处理双倍的指针变化。

1》头部之后第一节点插入

尾部类似。

2》其他位置插入

1.3.2、删除

需要定位到要删除的链结点,然后改变了其前后链结点的指针,示意图如下:

代码实现:data-003-link  DoubleLink

主要麻烦的是插入删除,指针的指向。 

 

posted @ 2019-04-22 18:25  bjlhx15  阅读(2460)  评论(0编辑  收藏  举报
Copyright ©2011~2020 JD-李宏旭