8.1.数组存在的问题

在处理列表的时候数组是常用的数据结构。数组可以对所存储的数据项提供快速地存取访问,而且它很易于进行循环遍历操作。当然,数组已经是语言的一部分了,用户不需要使用额外的内存,也不需要花费因使用用户自定义的数据结构所需的处理时间。
然而正如所见,数组不是一种最佳的数据结构。在无序数组中查找一个数据项是很慢的,这是因为在找到要查找的元素之前需要尽可能地访问到数组内的每一个元素。有序(排序)数组对查找而言会更加高效一些,但是插入和删除操作还是很慢的,因为需要向前或向后移动元素来为插入留出空间,或者为删除移除空间。更别提在有序数组内还需要为插入元素查找到合适的位置了。

 

8.2.定义

链表是被称为节点的类对象的群集。每一个节点通过一个引用链接到列表内的后继节点上。节点包括存储数据的字段和节点引用的字段。到另外一个节点的引用被称为是链接。

数组:元素是通过位置(索引)进行引用

链表:元素是通过它们与数组其他元素的关系进行引用

大家会说“ Bread”跟在“ Milk”的后面,而不会说“ Bread”是在第二个位置上。遍历链表是从链表的起始节点一直到末尾节点。

还需要注意的一点就是对链表结尾的标记是通过指向空( null)值实现的。既然是在内存中处理类对象,所以就用空( null)对象来表示列表的末尾。

 

在许多链表的实现中通常会包含一个被称为“头节点”的特殊节点来作为链表的起始位置。

插入操作成为一种非常有效的工作。所要做的就是

1.把要插入节点之前节点的链接改为指向要插入的节点,

2.并且把新节点的链接设为指向插入之前前节点所指向的节点。

把数据项“ Cookies”添加到链表内“ Eggs”的后面

 

从链表中移除数据项也是如此容易。

1.就是简单地把要删除节点之前节点的链接重定向到删除节点所指向的节点,

2.并且把删除节点的链接设为空( null)就可以了

 

8.3 面向对象链表的设计

链表的设计至少包含两个类

这里会创建一个 Node 类,而且每次向链表添加节点的时候会实例化一个 Node对象。

链表内的节点通过索引与其他节点相互连接在一起。而且把这些索引设置为使用创建在一个独立的 LinkedList类中的方法。

 

8.3.1.Node类

节点是由两个数据成员组成的:存储着节点数据的 Element,以及存储着指向表内下一节点引用的 Link。

为了完成 Node 类的定义,至少需要两种构造器方法。明确地需要一个默认的构造器来创建一个空的 Node,其中的 Element 和 Link 都设为空( null)。

还需要一个参数化的构造器用来给成员 Element 赋值数据,并且把成员 Link设置为空( null)。

public class Node
{
public Object Element;
public Node Link;
public Node()
{
Element = null;
Link = null;
}
public Node(Object theElement)
{
Element = theElement;
Link = null;
}
}

 

8.3.2 LinkedList

LinkedList 类用来创建链表中节点之间的链接。

需要一种构造器方法来实例化链表。

此类中唯一的数据成员就是头节点。

    public class LinkedList
{
protected Node header;
public LinkedList()
{
header = new Node("header");
..
}
}

头节点从其 Link 字段设置为空( null)开始。当把第一个节点添加到链表中的时候,会把头节点的 Link 字段设置成指向新的节点,并且把新节点的 Link 字段设置为空( null)。

 

 

8.4 链表设计的改进方案

8.4.1 双向链表

8.4.2 循环链表

8.5.使用 Iterator

LinkedList 类存在的一个问题就是不能在链表内同时引用两个位置。大家可以引用链表内的任何一个位置(当前节点、前一个节点等等),但是如果想指定两个甚至更多个位置,比如想从链表中移除一段范围内的节点,就需要一些其他方法了。这种方法就是 Iterator 类。

数据结构和算法 – 8.链表的更多相关文章

  1. Java数据结构和算法(四)--链表

    日常开发中,数组和集合使用的很多,而数组的无序插入和删除效率都是偏低的,这点在学习ArrayList源码的时候就知道了,因为需要把要 插入索引后面的所以元素全部后移一位. 而本文会详细讲解链表,可以解 ...

  2. C语言 - 基础数据结构和算法 - 企业链表

    听黑马程序员教程<基础数据结构和算法 (C版本)>,照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友可 ...

  3. C语言 - 基础数据结构和算法 - 单向链表

    听黑马程序员教程<基础数据结构和算法 (C版本)>,照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友可 ...

  4. Java数据结构和算法之链表

    三.链表 链结点 在链表中,每个数据项都被包含在‘点“中,一个点是某个类的对象,这个类可认叫做LINK.因为一个链表中有许多类似的链结点,所以有必要用一个不同于链表的类来表达链结点.每个LINK对象中 ...

  5. JavaScript 数据结构与算法3(链表)

    学习数据结构的 git 代码地址: https://gitee.com/zhangning187/js-data-structure-study 1.链表 本章学习如何实现和使用链表这种动态的数据结构 ...

  6. JavaScript数据结构与算法(六) 链表的实现

    // 链表存储有序的元素集合,但不同于数组,链表中的元素在内存中并不是连续放置的.每个 // 元素由一个存储元素本身的节点和一个指向下一个元素的引用(也称指针或链接)组成.下图展 // 示了一个链表的 ...

  7. js数据结构与算法--单链表的实现与应用思考

    链表是动态的数据结构,它的每个元素由一个存储元素本身的节点和一个指向下一个元素的引用(也称指针或链接)组成. 现实中,有一些链表的例子. 第一个就是寻宝的游戏.你有一条线索,这条线索是指向寻找下一条线 ...

  8. 用Python实现的数据结构与算法:链表

    一.概述 链表(linked list)是一组数据项的集合,其中每个数据项都是一个节点的一部分,每个节点还包含指向下一个节点的链接(参考 <算法:C语言实现>). 根据结构的不同,链表可以 ...

  9. 数据结构与算法之链表-javascript实现

    链表的定义: 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成.每个结点 ...

随机推荐

  1. 如何在 CentOS 7 用 cPanel 配置 Nginx 反向代理

    导读 Nginx 是最快和最强大的 Web 服务器之一,以其高性能和低资源占用率而闻名.它既可以被安装为一个独立的 Web 服务器,也可以安装成反向代理 Web 服务器.在这篇文章,我将讨论在安装了 ...

  2. 获取SHA1和MD5

    首先:1.我们进入到通过cmd打开控制台,进入cmd定位到.android文件夹下.如下图: 2.输入keytool -list -v -keystore debug.keystore得到三种指纹证书 ...

  3. Android实用代码模块集锦

    1. 精确获取屏幕尺寸(例如:3.5.4.0.5.0寸屏幕) 1 2 3 4 5 6 public static double getScreenPhysicalSize(Activity ctx)  ...

  4. java78_c

    import java.util.*; public class Main { public static void main(String args[]){ Scanner cin=new Scan ...

  5. 【工具】【版本控制】TortoiseSVN过滤文件与文件夹

    这些网上搜一大把,就直接截图过来了.

  6. jQuery清除文本框,内容并设置不可用

    JQuery清除文本框,内容并设置不可用  如果是设置只读,则将disabled换成readonly function CleanText(textid) { $("#"+text ...

  7. 【leetcode】Rotate Image

    Rotate Image You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees ...

  8. android课件和源代码

    ppt.rar 代码.rar 也可以自己从这里下载http://pan.baidu.com/share/link?shareid=1287391506&uk=2634355140

  9. Selenium FF WebDriver 遍历所有链接(另类爬虫)

    请看这个页面,我想要找到某个公告的内容,必须一个一个打开链接,尼玛好多啊. 于是,我机智的使用selenium打开每一个链接,然后把公告内容写入txt 那需要做一下步奏 1.依次打开一个公告 2.切换 ...

  10. ffmpeg-20160815-bin.7z

    ESC 退出 0 进度条开关 1 屏幕原始大小 2 屏幕1/2大小 3 屏幕1/3大小 4 屏幕1/4大小 S 下一帧 [ -2秒 ] +2秒 ; -1秒 ' +1秒 下一个帧 -> -5秒 f ...