zoukankan      html  css  js  c++  java
  • 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

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

  • 相关阅读:
    Spring Data JPA条件查询
    Cannot add foreign key constraint
    项目运行慢的原因剖析
    文本摘要的一些研究概念
    datatables表格设置序号自增
    记录一次没有报错的错误
    final、static、this、super关键字总结
    datatables条件搜索后表格内出现重复字符串
    linux上重装redis,设置密码
    datatables render出现重复的字符
  • 原文地址:https://www.cnblogs.com/bjlhx/p/10751938.html
Copyright © 2011-2022 走看看