- 浏览: 18314 次
- 性别:
- 来自: 湖南常德
最新评论
首先,链表是一种顺序存储结构,每一个节点由存储数据元素的数据域和指向下一个节点的指针域(双向链表还有指向父节点的指针域)组成。链表在内存中是非连续、非顺序。与线性表相比,链表的插入和删除比较方便。
一、单向链表
单向链表的节点由存储数据的数据域和指向下一个节点的指针域组成,在java中我们用类封装其数据结构,代码示例:
public class LinkNode {
private LinkNode child;// 对下一个节点的应用 private LinkNode parent;// 对上一个节点的应用 private Object obj;// 节点内的数据对象 private LinkNode next;// 节点的下个元素 private String name; // 在创建节点对象的时候就传入节点中的数据对象 public LinkNode(Object obj) { this.obj = obj; } public Object getObj() { return obj; } public void setObj(Object obj) { this.obj = obj; } public LinkNode getNext() { return next; } public void setNext(LinkNode next) { this.next = next; } public LinkNode getChild() { return child; } public void setChild(LinkNode child) { this.child = child; } public void setParent(LinkNode parent) { this.parent = parent; } public LinkNode getParent() { return parent; } public void setName(String name){ this.name= name; } public String getName(){ return name; } }
有了这个类我们就可以实现一个简单的单向链表。
private LinkNode root;
public class LinkList(){ // 主函数 public static void main(String[] args) { LinkList list = new LinkList(); //创建链表 LinkNode root = list.creatLink(); //遍历 list.printLinkList(root); } /** * 创建链表 * * @return */ public LinkNode creatLink() { String s = "根节点"; root = new LinkNode(s); LinkNode n1 = new LinkNode("一节点"); LinkNode n2 = new LinkNode("二节点"); LinkNode n3 = new LinkNode("三节点"); LinkNode n4 = new LinkNode("四节点"); root.setNext(n1); n1.setNext(n2); n2.setNext(n3); n3.setNext(n4); return root; } /** * 遍历链表的方法 * * @param root */ public void printLinkList(LinkNode root) { if (null != root) { Object data = root.getObj(); System.out.println(data); LinkNode temp = root.getNext(); printLinkList(temp); } } }
这样我们就实现了一个简单的单向链表
二、双向链表
双向链表实际上是单向链表的改进,加上了一个指向父节点的指针域,在封装双向节点的结时,大致和单向链表相同,只要加上父节点。例如我们实现一个用链表实现存储工人工资,并按顺序输出
/**
* 加入新的节点 * * @param obj */ public void add(Object obj) { // 创建新的节点 LinkNode node = new LinkNode(obj); // 判断链表是够空 if (null == front) { front = node; last = front; } else { last.setChild(node); node.setParent(last); last = node; } } /** * 在指定索引插入节点 * * @param index * @param obj */ public void insertIndexObj(int index, Object obj) { if (this.getLength() < index || index < 0) { throw new java.lang.RuntimeException("下标越界" + index + ",size:" + this.getLength()); } else { // 创建一个心得节点 LinkNode newNode = new LinkNode(obj); // 得到当前索引位置的节点 LinkNode node = this.getLinkNode(index); if (index == 0) { front = newNode; } else { // 得到父节点 LinkNode fNode = node.getParent(); // 设置新的引用关系 fNode.setChild(newNode); newNode.setParent(fNode); } // 设置心得引用关系 newNode.setChild(node); node.setParent(newNode); } } /** * 根据索引删除节点 * * @param index * :索引 */ public void deleteLinkNode(int index) { // 判断index是否有效 if (this.getLength() < index || index < 0) { throw new java.lang.RuntimeException("下标越界" + index + ",size:" + this.getLength()); } else { // 得到当前索引位置的节点 LinkNode node = this.getLinkNode(index); // 得到父节点 LinkNode fNode = node.getParent(); // 得到子节点 LinkNode cNode = node.getChild(); if (fNode == null) { front = cNode; } else if (cNode == null) { fNode.setChild(cNode); } else { fNode.setChild(cNode); cNode.setParent(fNode); } } } /** * 根据索引取出节点 * * * @param index * :第几个节点 * @return 根据节点返回的节点 */ public LinkNode getLinkNode(int index) { if (this.getLength() < index || index < 0) { throw new java.lang.RuntimeException("下标越界" + index + ",size:" + this.getLength()); } else { int num = 1; LinkNode node = front; while (num != index) { node = node.getChild(); num++; } return node; } } /** * 得到链表长度 * * @return */ public int getLength() { int count = 0; if (front == null) { return count; } LinkNode node = front.getChild(); while (null != node) { count++; node = node.getChild(); } return count + 1; } /** * 修改节点对象内容 * * @param index * -对象节点索引 * @param obj * 修改对象内容 */ public void UpdateLinkNode(int index, Object obj) { if (this.getLength() < index || index < 0) { throw new java.lang.RuntimeException("下标越界" + index + ",size:" + this.getLength()); } else { // 得到当前索引位置的节点 LinkNode node = this.getLinkNode(index); node.setObj(obj); } } /** * 遍历链表的方法 * * @param root */ public void printLinkList(LinkNode front) { int j = 0; if (null != front) { // 打印信息 System.out.println(((Staff_Salary) front.getObj()).getName() + " 工资:" + ((Staff_Salary) front.getObj()).getSalary()); LinkNode temp = front.getChild(); printLinkList(temp); } } /** * 将对象加入数组 */ public void setArrry(LinkNode front) { for (int i = 0; i < 20; i++) { array[i] = (Staff_Salary) getNextObj(); // System.out.println(array); } Seqencing(array); } /** * 得到链表的下一个节点 * @return */ public Object getNextObj() { Object data = front.getObj(); front = front.getChild(); return data; } }
发表评论
-
git入门
2015-02-11 11:02 0git入门 -
JVM内存结构浅谈
2013-05-19 14:47 659Java程序的运行过程: ... -
菜鸟入门之网页数据抓取
2013-05-04 21:53 5526有时候需要从网页上获取数据,比如别一些网页上的新闻获取到放 ... -
动态编译
2013-03-01 22:33 583前几天谈论了关于动 ... -
位映射
2013-03-01 22:33 917前些天讨论了位映射的内容,一个具体的例子就对于M个int ... -
线程同步
2013-03-01 22:34 7131,为什么要有线程同 ... -
生产消费模型
2013-03-01 22:34 678当遇到一个线程要产生数据而另一个线程要处理数据时,这就是生 ... -
设计模式之单例模式
2012-12-02 23:02 0单例模式又叫单台模式或者单例模式 -
数据结构之Hash
2012-11-19 21:45 858数据结构之hash 首先介绍两种非常重要的数据结构。数组,为 ... -
数据结构之Hash
2012-11-18 14:47 0数据结构之hash 首先介 ... -
网络通信总结
2012-10-28 15:33 820网络通信:一句话说,用网络传输数据(各种数据) 。进行通讯那 ... -
哈弗曼压缩
2012-08-03 11:43 668一、哈弗曼树,又称最优树,是一种带权路径长度最短的树。 ... -
线程及线程应用总结
2012-08-03 11:44 729一、什么是线程 每个java程序都至少有一个线程 ... -
树二叉树总结
2012-08-03 11:45 835一、数的相关 节点: 节点是树的基本组成单 ... -
java集合框架
2012-07-16 21:21 723java集合框架总结 主要由以下三部分组成: ... -
I/O体系结构总结
2012-07-16 21:22 883I/O体系结构总结 流的概念和分类: ... -
File相关类总结
2012-07-16 21:22 892File是java中的与文件相关的类,可以对进行创建、删 ... -
java异常机制
2012-07-11 13:01 691JAVA异常机制 一、异常的基本概念 简单的说 ... -
总结20120705
2012-07-05 10:07 650一、类与对象 1. ... -
java关键字总结
2012-05-20 13:31 705常用关键字: 访问修饰符关键字: public: 是最为公 ...
相关推荐
数组和链表总结 数组和链表.txt
链表是学习数据结构的大门,在微软等大公司招聘c\c++技术人员的时候有3个会必然出现 的东西,指针、链表、二叉树!
c语言中链表的学习,总结相当到位,对于初学者有很大的帮助!
链表总结,c语言版本,巩固基础知识,适用于求职面试,来自互联网,版权归著者
链表是最基本的数据结构,凡是学计算机的必须的掌握的,在面试的时候经常被问到,关于链表的实现,百度一下就知道了。 在此总结一下与链表相关的练习题。题目很全,好好消化。
java 链表心得,对于感到困难的朋友会有很大帮助,与其他语言互通
做有关链表的编程时,这个很实用! 不信试试! 我个人是觉得在做有关链表的程序时,是很好用的
数据结构,链表所有综合面试题型汇总,有大神漏缺的给我留言
C语言中关于链表的总结内容,内附代码例题,详细的有条理的讲解链表内容
php数组当链表-php数组和链表的区别总结 数组和链表.pdf
面试题总结:数组和链表的区别 数组和链表.pdf
城市链表课程设计里面含有详细文档,以及实现代码,资源完整。
多种方法实现链表的逆置。 c语言编写,可以任意字符输入。
1. 剑指offer 22.返回倒数第k个节点:林伟龙 【20:15-20:34】法思路1. 遍历第次链表计算链表度2. 遍历第次链表找到 第 k 个 元素法
php数组和链表的区别总结 数组和链表.pdf
数组和链表的对比分析 数组和链表.docx
顺序存储和链式存储 1 数组—顺序存储 1 链表—链式存储 2 链表概述 3 单链表 4 单链表概念和简单的设计 4 链表的初始化 5 头插入法创建单链表 6 尾插入法创建单链表 7 遍历单链表如打印、修改 8 ...关于链表的总结 23
数据结构的实验报告2链表的基本操作运算 实验内容 编写程序实现链表的建立和基本运算,并完成以下功能: 1、初始化链表、建立新链表。 2、查找节点。 3、 删除节点。 4、 插入节点。 5、 获得链表长度。 6、 退出。
动态链表,处理动态链表的函数,对动态链表的操作,对链表的插入操作(insert)等等
数组和链表的区别和优缺点总结 数组和链表.pdf