数据结构和算法 – 8.链表
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.链表的更多相关文章
- Java数据结构和算法(四)--链表
日常开发中,数组和集合使用的很多,而数组的无序插入和删除效率都是偏低的,这点在学习ArrayList源码的时候就知道了,因为需要把要 插入索引后面的所以元素全部后移一位. 而本文会详细讲解链表,可以解 ...
- C语言 - 基础数据结构和算法 - 企业链表
听黑马程序员教程<基础数据结构和算法 (C版本)>,照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友可 ...
- C语言 - 基础数据结构和算法 - 单向链表
听黑马程序员教程<基础数据结构和算法 (C版本)>,照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友可 ...
- Java数据结构和算法之链表
三.链表 链结点 在链表中,每个数据项都被包含在‘点“中,一个点是某个类的对象,这个类可认叫做LINK.因为一个链表中有许多类似的链结点,所以有必要用一个不同于链表的类来表达链结点.每个LINK对象中 ...
- JavaScript 数据结构与算法3(链表)
学习数据结构的 git 代码地址: https://gitee.com/zhangning187/js-data-structure-study 1.链表 本章学习如何实现和使用链表这种动态的数据结构 ...
- JavaScript数据结构与算法(六) 链表的实现
// 链表存储有序的元素集合,但不同于数组,链表中的元素在内存中并不是连续放置的.每个 // 元素由一个存储元素本身的节点和一个指向下一个元素的引用(也称指针或链接)组成.下图展 // 示了一个链表的 ...
- js数据结构与算法--单链表的实现与应用思考
链表是动态的数据结构,它的每个元素由一个存储元素本身的节点和一个指向下一个元素的引用(也称指针或链接)组成. 现实中,有一些链表的例子. 第一个就是寻宝的游戏.你有一条线索,这条线索是指向寻找下一条线 ...
- 用Python实现的数据结构与算法:链表
一.概述 链表(linked list)是一组数据项的集合,其中每个数据项都是一个节点的一部分,每个节点还包含指向下一个节点的链接(参考 <算法:C语言实现>). 根据结构的不同,链表可以 ...
- 数据结构与算法之链表-javascript实现
链表的定义: 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成.每个结点 ...
随机推荐
- ionic中返回上一页
.controller('NewsCtrl', ["$scope", "$ionicHistory", "$http","$tim ...
- Units Problem: How to read text size as custom attr from xml and set it to TextView in java code
Here is this topic’s background: I defined a custom View which extends FrameLayout and contains a Te ...
- replace、replaceAll、replaceFirst的区别详解
String s = "my.test.txt"; System.out.println(s.replace(".", "#")); Sys ...
- apscheduler 排程
https://apscheduler.readthedocs.org/en/v2.1.2/cronschedule.html 参数 说明 year 4位年 month 月份1-12 day 日:1- ...
- lenovo c340 centos 改键【尚无解】
公司给陪了个一体机. 键盘很无语,fn的位置在左下角.反人类设计. 破解: 1. bios,不幸不支持. 2. 改建: http://www.bitscn.com/hardware/nb/437603 ...
- Extjs PROXY查询params无法传参,改用extraParams
- JavaScript工作原理和Node异步I/O
1. 什么是JavaScript解析引擎? 简单地说,JavaScript解析引擎就是能够“读懂”JavaScript代码,并准确地给出代码运行结果的一段程序.比如var a=1+2:对于静态语言来说 ...
- Angularjs与bootstrap.datetimepicker结合实现日期选择器
http://www.lovelucy.info/angularjs-best-practices.html http://damoqiongqiu.iteye.com/blog/1917971 ht ...
- pl/sql中having的用法
HAVING的作用: 因为where关键字无法与聚集函数一起使用,HAVING可以和聚集函数一起使用 HAVING的语法: SELECT column_name, aggregate_function ...
- Call to undefined function mysql_connnect()
PHP Fatal error: Call to undefined function mysql_connnect() in /var/www/html/mysqltest.php on line ...