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

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

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

头指针:

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

头结点:

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

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

无头结点的链表



有头结点的链表



空链表

我试着用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. 2019-03-15 使用Request POST获取中加基金的PDF文件,并下载到本地

    import requests import time base_url='http://www.bobbns.com/common-web/cms/content!getContentsInclud ...

  2. static和extern的作用域--题目

    #include <stdio.h> ; int main(void) { , sum = , count = ; ,count++) // count = 2 { ; count++; ...

  3. [CSS3] The picture element

    <picture> <source media="(min-width: 1000px)" srcset="kookaburra_large_1x.jp ...

  4. Revolution Platform

    Revolution Platform 黑暗的极权统治现实 异类的处境 独孤的存在 觉者的形成 信仰的确立 信仰的产物 完整的思想理论 反抗与信仰的一致 反抗的超理性的智慧论 反抗的纯理性的方法论 反 ...

  5. 低效能的”where1=1”

    网上有不少人提出过类似的问题:"看到有人写了where 1=1这种sql,究竟是什么意思?".事实上使用这种使用方法的开发者一般都是在使用动态数组的sql. 让我们想象例如以下的场 ...

  6. EditText电话号码格式化输入、删除案例

    我们在输入电话号码的时候,一般都会切割一个较长的电话号码.这种话效果会好非常多..对EditText的监听能够轻松的实现这个需求.仅仅须要我们给相应的EditText加一个监听就OK了..贴一下我写的 ...

  7. 【MVC架构】——怎样利用Json在View和Controller之间传递数据

    在MVC架构中,尽管非常多东西和三层非常相似,可是也有非常大的差别.就比方传递数据.在三层架构中,传递数据就仅仅要一层返回,另外一层用同样类型的变量来接收即可了.在MVC中,事实上原理是一样的,Con ...

  8. scikit-learn:3.5. Validation curves: plotting scores to evaluate models

    參考:http://scikit-learn.org/stable/modules/learning_curve.html estimator's generalization error can b ...

  9. JS 控制checkbox 获取 全选 全不选 一行不选择全选则不被选择 所有选择全选被选择

    //点击全选button的事件操作 function selectAll(){ var allcheckBoxs=document.getElementsByName("iTo") ...

  10. nyoj--891--找点(贪心)

    找点 时间限制:2000 ms  |  内存限制:65535 KB 难度:2 描述 上数学课时,老师给了LYH一些闭区间,让他取尽量少的点,使得每个闭区间内至少有一个点.但是这几天LYH太忙了,你们帮 ...