- 浏览: 24036 次
- 性别:
数据结构之链表
链表的基本概念
链表是一种物理上不连续,逻辑上上连续的存储结构。其逻辑上连续的特性是由链表中的指针指向实现的。
链表是由一系列节点构成的,每个节点都由两个部分组成:一是存储数据元素的数据域,二是存储相关联节点地址的指针域。
根据指针域的不同,可将链表分为:单向链表,双向链表,循环链表。
一.单向链表
单向链表是指,指针域中的指引只有一个,即指向下一个节点的地址。
二.双向链表
双向链表含有2个指针域,分别指向上一个和下一个节点的地址。相比较单向链表,双向链表的优越性体现在,查找某个元素的时候,单向链表必须从头结点开始,而双向链表则可以避免这种弊端。
一般,我们把双向链表,存储直接子节点的链域称为右链域,存储直接父节点的链域称为左链域。
以下以双向链表的增删改查基本操作介绍:
1)链表的创建最基本的是节点的建立
public class LinkNode { private Stuff obj;// 结点内的数据对象,即员工类 private LinkNode last;// 上一个结点的引用 private LinkNode next;// 下一个结点的引用 public LinkNode( Stuff obj) {//构造函数 this.obj=obj; } public Stuff getObject() {//得到数据 return obj; } public void setObject(Stuff obj) {//设置数据域 this.obj = obj; } public LinkNode getLast() {//得到上一个节点 return last; } public void setLast(LinkNode last) {//设置上个节点 this.last = last; } public LinkNode getNext() {//得到下个节点 return next; } public void setNext(LinkNode next) {//设置下个节点 this.next = next; } }
2)插入节点
A)顺序插入
public void add(LinkNode node) {
if (null == root) {// 链表是空。Root:根节点 root = node; end = root; } else { end.setNext(node);//设置关系 node.setLast(end); end = node; } }
B)在指定索引出插入节点
public void insertIndex(int index, Stuff obj) { if (this.getLength() < index || index < 0) { throw new RuntimeException("下标越界:" + index + ",size:" + this.getLength()); } else { // 创建一个新的节点 LinkNode newnode = new LinkNode(obj); // 得到当前索引位置的节点 LinkNode node = this.getLinkNode(index); if (index == 0) {// 如果链表没有节点 root = newnode; } else { // 得到上一个节点,此时都是从指引前插入 LinkNode Lnode = node.getLast(); Lnode.setNext(newnode); newnode.setLast(Lnode); } newnode.setNext(node); node.setLast(newnode); } }
2)删除节点
public void deleteLinkList(int index, Object obj) { if (this.getLength() < index || index < 0) { throw new RuntimeException("下标越界:" + index + ",size:"+ this.getLength()); } else { // 得到当前索引位置的节点 LinkNode node = this.getLinkNode(index); // 得到上一个节点 LinkNode Lnode = node.getLast(); LinkNode Nnode = node.getNext(); if (Lnode == null) { root = Nnode; } else if (Nnode == null) { Lnode.setNext(null); } else { Lnode.setNext(Nnode);//直接设置上一个节点域下一个节点的关 联关系,要删除的节点自动被删除 Nnode.setLast(Lnode); } } }
3)查找节点
public LinkNode getLinkNode(int index) { if (this.getLength() < index || index < 0) { throw new RuntimeException("下标越界:" + index + ",size:" + this.getLength()); } else { int count = 0; LinkNode node = root; ; while (count != index) { node = node.getNext(); count++; } return node; } }
4)得到链表长度
public int getLength() { int count = 0; if (root == null) { return count; } LinkNode node = root.getNext(); while (node != null) { count++; node = node.getNext(); } return count + 1; }
5)改变节点对象
public void UpdateLinkNode(int index, Stuff obj) { if (this.getLength() < index || index < 0) { throw new RuntimeException("下标越界:" + index + ",size:" + this.getLength()); } else { // 得到当前索引位置的节点 LinkNode node = this.getLinkNode(index); node.setObject(obj); } }
6)遍历链表
public void printLinkList(LinkNode root) { if (null != root) {//如果根节点不为空 Stuff p=(Stuff) root.getObject();//得到数据域对象 LinkNode temp=root.getNext();//得到下一个节点 printLinkList(temp);//递归调用 } }
发表评论
-
java基础整理
2013-05-13 22:22 0Java基础整理 从武汉回来有好几周的时间了 ... -
线程同步
2013-01-18 23:49 825窗外狂风大作,实在不想在睡觉时刻本着不完成誓不罢休不 ... -
线程同步
2013-01-18 23:19 0窗外狂风大作,实在不 ... -
数据结构-----Hash
2012-11-23 10:14 867数据结构之Hash表 一.数据结构概念 数据结 ... -
通信基础小结
2012-10-29 00:14 748通信基础小结 通信 ... -
线程项目总结
2012-08-01 22:46 909线程项目——坦克大战总结 一.预计游 ... -
线程基础
2012-08-01 22:32 603线程基础 一.进程和线程 ... -
哈弗曼树解压缩
2012-07-30 15:06 787... -
IO总结
2012-07-16 21:05 645Java IO 总结 第一部分 ... -
Java集合机制
2012-07-15 20:01 989Java 集合框架 一.关于集合 ... -
异常机制
2012-07-11 14:30 738JAVA异常机制总结 ... -
画图板小结
2012-07-05 10:05 706项目总结——画板 一.整体思路 ... -
关键字
2012-05-25 16:28 599关键字总结 一.关键字分类 1.常用关键字 ... -
继承,转型,重写,多态性
2012-05-13 15:11 669Java实战入门小结——02 一:继承 1 ... -
类,对象,构造函数,this关键字等
2012-04-15 22:48 1120Java实战入门小结--01 一:类与对象的关系 类 ...
相关推荐
数据结构之链表,C#链表 数据结构之链表,C#链表 数据结构之链表,C#链表 数据结构之链表,C#链表 数据结构之链表,C#链表 数据结构之链表,C#链表
算法-数据结构之链表合并算法.rar
C通用范例源代码之数据结构之链表.pdfC通用范例源代码之数据结构之链表.pdfC通用范例源代码之数据结构之链表.pdfC通用范例源代码之数据结构之链表.pdfC通用范例源代码之数据结构之链表.pdfC通用范例源代码之数据结构...
数据结构 数据结构_使用javascript讲解数据结构之链表
C语言中数据结构之链表归并排序实例代码 问题 设有两个无头结点的单链表,头指针分别为ha,hb,链中有数据域data,链域next,两链表的数据都按递增排序存放,现要求将hb表归到ha表中,且归并后ha仍递增序,归并中...
基础数据结构之链表
线性表的存储结构使用链表。 2、提供操作:自表首插入元素、删除指定元素、搜索表中是否有指定元素、输出链表。 3、接收键盘录入的一系列整数(例10,25,8,33,60)作为节点的元素值,创建链表。输出链表内容。 4、输入...
自己写的 数据结构之链表栈与队列 出来与同路的新手分享
数据结构之链表.ppt该文档详细且完整,值得借鉴下载使用,欢迎下载使用,有问题可以第一时间联系作者~
这是一个链表的代码,它对于初学者来说是一个有很好帮助的东西,完全是自己写的,已经通过编程测试,供大家一起来分享!
1.使用Python语言实现链表数据结构 2.基于类封装思想 3.实现链表增删改查功能 4.有测试数据
数据结构顺序链表的实现数据结构顺序链表的实现数据结构顺序链表的实现数据结构顺序链表的实现数据结构顺序链表的实现数据结构顺序链表的实现
本文实例讲述了JS中的算法与数据结构之链表(Linked-list)。分享给大家供大家参考,具体如下: 链表(Linked-list) 前面我们讨论了如何使用栈、队列进行存数数据,他们其实都是列表的一种,底层存储的数据的数据结构都...
单链表 单循环链表 双链表 双循环链表 内容学习于 https://www.bilibili.com/video/BV1W64y1z7jh?p=19&spm_id_from=pageDriver&vd_source=4d33bf4ac4499f2c0370694554a02fa5
主要是针对c++中的链表模版进行了实现,希望可以帮助需要的人
C++数据结构之链表的创建 前言 1.链表在C/C++里使用非常频繁, 因为它非常使用, 可作为天然的可变数组. push到末尾时对前面的链表项不影响. 反观C数组和std::vector, 一个是静态大小, 一个是增加多了会对之前的元素...
list v2 用Object对象,接口inteface,迭代器Iterator实现linklist,Arraylist