zoukankan      html  css  js  c++  java
  • 链表

    在数组之后,链表结构(linked structure)可能是程序员最常用到的数据结构。和数组一样,链表结构是一个具体的数据类型,它实现了很多类型的集合,包括列表。

    一、单链表结构和双链表结构

    链表结构包含了链接到其他项的项。尽管各项中包含很多链接也是可能的,但链表结构的两种最简单的结构是单链表结构(singly linked structure)和双链表结构(doubly linked structure)。

    单链表结构的用户,通过沿着一个外部的头链接(head link)来访问第一项。然后,用户通过从第一项产生的、串连起来的、单个的链条来访问其他的项。因此,在单链表结构中,很容易获取一个项的后继项,但是并不是很容易获取一个项的前驱项。

    双链表包含两个方向的链接。因此,用户很容易获取一个项的前驱项和它的后继项。第二个外部链接叫尾链接(tail link),它允许双链表的用户直接访问最后一项。

    在这两种类型的链表中,最后一项都没有指向下一项的链接。上图海表示出了缺少链接的情况,这叫做空连接(empty link),用一个斜杠而不是箭头来表示。还要注意,一个两链表结构中的第一项是没有指向其前驱项的链接的。

    和数组一样,这些链表结构表示了项的线性序列。然而,使用一个链表结构的程序员无法体通过指定索引位置来立即访问一项。相反,程序员必须从结构的一段开始沿着链表进行,直到达到想要的位置(或项)。链表的这一属性,对于稍后将要介绍的几种操作有着至关重要的影响。

    为链表分配内存的方式和数组有很大的不同,并且对于插入和删除操作有两个重要的影响:

    1. 一旦找到一个插入点或删除点,就可以进行插入或删除,而不需要在内存中移动数据项。
    2. 在每次插入或删除的过程中,链表结构会调整大小,并且不需要额外的内存代价,也不需要复制数据项。

    现在我们知道了链表数据结构的底层内存支持使得这些优点成为可能的。

    二、非连续性内存和节点

    数组必须储存在连续的内存中。这意味着,数组中项逻辑顺序是和内存中的物理单元序列紧密耦合。相反,链表结构将结构中的项的逻辑顺序和内存中的顺序解耦了。也就是说,只要计算机遵照链表结构中一个给定项的地址和位置的链接,就能够在内存中找到它的单元在何处。这种内存表示方案,叫做非连续性的内存。

    链表中的基本单位用节点来表示。单链表的节点包含如下的节点或字段:

    1. 一个数据项。
    2. 到结构中的下一个节点的一个链接。

    除了这些部分,双链表还包含到结构中的前一个节点的链接。

    可以用如下几种节点设置方式来使用不连续的内存:

    •  在诸如FORTRAN这样较早的语言中,唯一内建的数据结构是数组。程序员使用两个并行的数组,由此实现一个单链表结构的节点及其不连续的内存。一个数组包含了数据项,另一个数组根据数据数组中对应的项,包含了其后继项在数据数字中的索引位置。由此,遵从一个链接意味着使用第1个数组中的一个数据的索引,来访问第2个数组中的值,然后将这个值来作为索引访问第1个数组中的另一个数据项。空链接值用-1来表示。下图展示了一个链表结构和它的数组表示,这一设置有效地将数据项的逻辑位置与其在数组中的物理位置解耦了。

    •  在较为现代的语言中,例如Pascal和C++中,程序员以指针的形式直接访问数据的地址。这些较为现代的语言之中,单链表中的一个节点,包含了一个数据项和指针值。一个特殊的空值(或nil),表示指针值是一个空链接。程序员并不使用数组来建立不连续的内存。而是直接向计算机请求一个指针向一个新的节点,这个节点来自于新的对象堆(object head)的一个内建的不连续内存区域。然后程序员在该节点中设置了指向另一个节点的指针,由此建立了到结构中的其他数据的一个链接。显示的使用指针和内建的堆,显得比FORTRAN式的方案更为高级,因为程序员不再负责管理那些不连续的底层数组表示(毕竟,任何计算机的内存,也就式RAM,最终都是只一个大的数组)。然而,Pascal和C++仍然要求程序员必须通过一种特殊的处理或删除操作,来向其返回那些不再使用的节点。
    • python程序员使用对对象的引用建立起了节点和链表结构。在python中,任何变量都可以引用任何内容,包括None值,它意味着一个空链接。由此,python程序员通过定义包含两个字段的一个对象,从而定义了一个单链表节点。这两个字段是:数据项的一个引用和到另一个节点的一个引用。python为每一个新的节点对象提供了动态分配的非连续内存,并且当对象不再被用于程序引用的时候,会自动把内存返回给系统(垃圾收集)。
  • 相关阅读:
    hdu 1518 square
    AWR报告的使用
    状态模式之观察者和状态模式
    Arduino笔记五三轴陀螺仪L3G4200D
    TCP IP 学习笔记 二 链路层
    机房收费系统数据库设计小结
    TMSSCRIPTER介绍
    TMSScripter语法
    listview的一些用法
    进制转换
  • 原文地址:https://www.cnblogs.com/aaronthon/p/13598807.html
Copyright © 2011-2022 走看看