线性表的链式存储结构,也称之为链式表,链表;链表的存储单元能够连续也能够不连续

链表中的节点包括数据域和指针域。数据域为存储数据元素信息的域,指针域为存储直接后继位置(一般称为指针)的域。

注意一个头结点和头指针的差别:

头指针:

  • 指向链表的第一个节点的指针。若链表有头结点,则是指向头结点的指针;
  • 头指针具有标识作用,所以经常使用头指针作为链表的名字;
  • 不论链表是否为空,头指针都不为空;
  • 是链表的必要元素。

头结点:

  • 头结点是为了操作的统一和方便而设立的。放在第一个元素节点的前面,其数据域一般无意义,也能够存放链表的长度;
  • 头结点不是链表的必要元素。

这里先讲讲单链表吧。其它的后面再讲。

无头结点的链表



有头结点的链表



空链表

我试着用Java写了一个LinkedList的代码,例如以下:

  package com.phn.datestructure;

/**
* @author 潘海南
* @Email 1016593477@qq.com
* @TODO 链式表
* @date 2015年7月18日
*/
public class FOLinkedList<E> {
// 单链表的头结点
private FOLinkedNode<E> header = null;
// 单链表的长度
private int size; /**
* @TODO 默认的无參构造函数
*/
public FOLinkedList() {
super();
this.header = new FOLinkedNode<E>();
this.setSize();
}
/**
* @TODO 单链表加入元素
* @param e 数据元素类型
* @return true
*/
public boolean add(E e) {
FOLinkedNode<E> node = new FOLinkedNode<E>(e);
if (header.getE() == null) {
header.setE(e);
} else {
FOLinkedNode<E> lastNode = this.last(this.header);
lastNode.addNext(node);
} this.size++;
return true;
}
/**
* @TODO 单链表插入元素
* @param index 插入位置
* @param e 数据元素类型
* @return true
*/
public boolean insert(int index,E e) {
FOLinkedNode<E> node = new FOLinkedNode<E>(e);
FOLinkedNode<E> preNode = this.get(index - 1);
node.addNext(preNode.next);
preNode.addNext(node);
this.size++;
return true;
}
/**
* @TODO 单链表删除元素
* @param index 将要删除的元素的索引位置
* @return E 删除的元素
*/
public FOLinkedNode<E> remove(int index){
FOLinkedNode<E> preNode = this.get(index-1);
FOLinkedNode<E> node = preNode.next;
preNode.addNext(preNode.next.next);
node.addNext(null);
this.size--;
return node;
}
/**
* @TODO 依据元素索引位置获取元素
* @param index 元素的索引位置
* @return E 元素e
*/
public FOLinkedNode<E> get(int index) {
validateIndex(index);
FOLinkedNode<E> temp = this.header;
int i = 0;
while (i < index - 1) {
if (temp != null) {
temp = temp.next;
i++;
} else {
throw new RuntimeException("节点空值错误");
}
}
return temp;
}
/**
* @TODO 将单链表中索引位置为i的元素改动为元素e
* @param index 元素的索引位置
* @param e 须要改动成的元素
* @return true 改动成功标志
*/
public boolean set(int index, E e){
validateIndex(index);
FOLinkedNode<E> oldNode = this.get(index);
oldNode.setE(e);
return true;
}
/**
* @TODO 验证所给索引位置是否合法
* @param index 给出的索引位置
*/
private void validateIndex(int index) {
if (index > this.size || index < 0) {
throw new RuntimeException("索引错误:" + index);
}
}
/**
* @TODO 获取单链表的最后一个节点
* @param header 单链表的头结点
* @return node 单链表的最后一个节点
*/
private FOLinkedNode<E> last(FOLinkedNode<E> header) {
FOLinkedNode<E> temp = header;
while (true) {
if (temp.next == null) {
return temp;
}
temp = temp.next;
}
} @Override
public String toString() {
return "[" + this.NodesToString(this.header) + "]";
}
/**
* @TODO 设置单链表的长度
* @param header 单链表的头结点
* @return 单链表的节点字符串序列
*/
private String NodesToString(FOLinkedNode<E> header) {
StringBuffer sb = new StringBuffer();
if (header != null) {
sb.append(header.getE());
FOLinkedNode<E> temp = new FOLinkedNode<E>();
temp = header.next;
while (temp != null) {
sb.append(", " + temp.getE());
temp = temp.next;
}
} return sb.toString();
}
/**
* @TODO 设置单链表的长度
*/
private void setSize() {
this.size = 0;
}
/**
* @TODO 获取单链表的长度
* @return size 单链表的长度
*/
public int size() {
return this.size;
}
}

节点类:

package com.phn.datestructure;
public class FOLinkedNode<E> {
private E e;// 结点中存放的数据 FOLinkedNode() {
} FOLinkedNode(E e) {
this.e = e;
} FOLinkedNode<E> next;// 用来指向该结点的下一个结点 // 设置下一节点的值
void addNext(FOLinkedNode<E> node) {
next = node;
} public E getE() {
return e;
} public void setE(E e) {
this.e = e;
} @Override
public String toString() {
return "Node [e=" + e + ", next=" + next + "]";
} }

这里也讲讲数据元素的插入和删除操作。

插入操作演演示样例如以下:







代码:

s->next = p->next;
p->next = s;

这里摘了《大话数据结构》的一段文字解释:

删除操作例如以下图:

一句代码:

p->next = p->next->next;

结合上述代码和图例。能够看出单链表的删除和插入操作都是由两部分组成:

  1. 遍历查找到须要操作的位置的那个元素;
  2. 然后进行插入和删除操作。

以下是摘自《大话数据结构》的分析:

单链表的整表创建

方法有头插法和尾插法;

头插法:相当于插队的方法。例如以下图

相对于头插法。尾插法更加合理一些。

单链表的整表删除

以下是摘自《大话数据结构》的分析:



以下比較一下单链表和顺序表:

Java数据结构-线性表之单链表LinkedList的更多相关文章

  1. Java数据结构-线性表之静态链表

    静态链表的定义: 节点由一个一维数组和一个指针域组成,数组用来存放数据元素,而指针域里面的指针(又称游标)用来指向下一个节点的数组下标. 这种链表称之为静态链表. 链表中的数组第一个和最后一个位置须要 ...

  2. [数据结构-线性表1.2] 链表与 LinkedList<T>(.NET 源码学习)

    [数据结构-线性表1.2] 链表与 LinkedList<T> [注:本篇文章源码内容较少,分析度较浅,请酌情选择阅读] 关键词:链表(数据结构)    C#中的链表(源码)    可空类 ...

  3. [数据结构 - 第3章] 线性表之单链表(C++实现)

    一.类定义 单链表类的定义如下: #ifndef SIGNALLIST_H #define SIGNALLIST_H typedef int ElemType; /* "ElemType类型 ...

  4. 线性表之单链表C++实现

    线性表之单链表 一.头文件:LinkedList.h //单链表是用一组任意的存储单元存放线性表的元素,这组单元可以是连续的也可以是不连续的,甚至可以是零散分布在内存中的任意位置. //单链表头文件 ...

  5. 【Java】 大话数据结构(2) 线性表之单链表

    本文根据<大话数据结构>一书,实现了Java版的单链表. 每个结点中只包含一个指针域的链表,称为单链表. 单链表的结构如图所示: 单链表与顺序存储结构的对比: 实现程序: package ...

  6. 数据结构(java版)学习笔记(三)——线性表之单链表

    单链表的优点: 长度不固定,可以任意增删. 单链表的缺点: 存储密度小,因为每个数据元素,都需要额外存储一个指向下一元素的指针(双链表则需要两个指针). 要访问特定元素,只能从链表头开始,遍历到该元素 ...

  7. [C++]数据结构:线性表之(单)链表

    一 (单)链表 ADT + Status InitList(LinkList &L) 初始化(单)链表 + void printList(LinkList L) 遍历(单)链表 + int L ...

  8. 续上文----线性表之单链表(C实现)

    本文绪上文线性表之顺序表(C实现) 本文将继续使用单链表实现线性表的另外一种存储结构.这种使用链表实现的存储结构在内存中是不连续的. C实现代码如下: #include<stdio.h> ...

  9. 线性表 (单链表、循环链表-python实现)

    一.线性表 线性表的定义: 线性表是具有相同数据类型的有限数据的序列. 线性表的特点: 出了第一个元素外,每个元素有且仅有一个直接前驱,除最后一个元素外有且只有一个后继. 线性表是一种逻辑结构,表示元 ...

随机推荐

  1. vi 编辑器的日常使用

    命令行模式: 光标管理 text  屏幕 行 单词 gg 跳转到文档头部 H 跳转到屏幕首行 ^  或 数字0 跳转到行首 w 向前 G 跳转到文档尾部 M 跳转到屏幕中行 $ 跳转到行尾 b 向后 ...

  2. ./configure --prefix /?/? 解释

    -- ./configure :编译源码 --prefix :把所有资源文件放在 之后的路径之后

  3. Python3的URL编码解码

    前言 博主最近在用python3练习一些爬虫脚本的时候,发现一些url的编码问题,在浏览器提交请求api时,如果url中包含汉子,就会被自动编码掉.呈现的结果是 ==> %xx%xx%xx.如果 ...

  4. H5知识点

    一.总体变化 1.H5文档结构 <!DOCTYPE html> <html> <head> <title>  这是标题  </title> ...

  5. javascript-知识点集合

    第三课.JavaScript的语法与关键字 1.JavaScript的语法 字符串.数字.布尔.数组.对象.Null.Undefined 1.js的变量区分大小写 username userName ...

  6. SQL SERVER-集合操作

    内连接      INNER JOIN(等值连接):只显示两个表中联结字段相等的行.这个和用select查询多表是一样的效果,所以很少用到:外连接:LEFT JOIN :以左表为基础,显示左表中的所有 ...

  7. 使用excel进行数据挖掘(3)----类别检測

    使用excel进行数据挖掘(3)----类别检測 在配置环境后,能够使用excel进行数据挖掘. 环境配置问题可參阅: http://blog.csdn.net/xinxing__8185/artic ...

  8. [Angular] Fetch non-JSON data by specifying HttpClient responseType in Angular

    By default the new Angular Http client (introduced in v4.3.1) uses JSON as the data format for commu ...

  9. jquery outerHeight方法 outerWidth方法 获取元素实际宽度高度

    曾经写代码中,每当须要获取元素的实际"宽度"(这里的宽度是指元素宽度加上其边距)时,都须要用元素宽度加上margin值才行,今天发现一个叫outerWidth(options)的方 ...

  10. VS2008执行MFC程序,提示microsoft incremental linker已停止工作解决方法

    事实上这边是由于设置有问题.详细的解决方式例如以下: 第一步:点击项目->"你的文件"属性->配置属性->链接器->启用增量链接   将  是(/INCRE ...