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

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

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

头指针:

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

头结点:

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

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

无头结点的链表



有头结点的链表



空链表

我试着用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. 在Vue中使用了Swiper ,动态从后台获取数据的之后,swiper滑动失效??

    在Vue中使用了Swiper ,动态从后台获取数据的之后,swiper滑动失效?? 是因为swiper提前初始化了,那时候数据还没有完全出来.这里有两种解决办法 1. 使用vue提供的$nextTic ...

  2. Vue-router入门

    1.npm install vue-router --save-dev 安装路由包,在安装脚手架时实际上可以直接安装 2.解读核心文件 router/index.js文件 import Vue fro ...

  3. 【BZOJ 1486】 [HNOI2009]最小圈

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 我们可以只想那个均值最小的环. 我们不知道那个环由哪些边构成 但我们可以把每条边都减掉mid 那个环受到的影响是什么呢? 如果这个均 ...

  4. 学渣乱搞系列之dp斜率优化

    学渣乱搞系列之dp斜率优化 By 狂徒归来 貌似dp的斜率优化一直很难搞啊,尤其是像我这种数学很挫的学渣,压根不懂什么凸包,什么上凸下凸的,哎...说多了都是泪,跟wdd讨论了下,得出一些结论.本文很 ...

  5. struct和typedef

    struct Test { int i; }; 解析:此处声明一个Test的结构体. 使用:在C语言中:struct Test t(此处的struct不可省略),在C++中:Test t(能够省略st ...

  6. STM32系列ARM单片机介绍

    STM32系列基于专为要求高性能.低成本.低功耗的嵌入式应用专门设计的ARM Cortex-M3内核.按性能分成两个不同的系列:STM32F103"增强型"系列和STM32F101 ...

  7. 阿里云部署Docker(8)----安装和使用redmine

    安装redmine对过程进行管理. 须要说明的是:当你在docker images的时候,会说没连接到xxxx的时候,并且会提示用"docker -d".事实上这仅仅是把docke ...

  8. 安卓获取百度地图的Api key

    1.进入开发中心 2.如何获取SHA1 3.如何获取包名

  9. HTML基础——网站信息显示页面

    1.语法和规范 HTML文件都是以.html或者.htm结尾的.建议使用.html结尾. HTML文件分为头部分(<head></head>)和体部分(<body> ...

  10. [转帖]关于Xilinx下Micro_Blaze中UartLite232外设的使用

    来源:https://blog.csdn.net/shen_you/article/details/78713746