博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Java数据结构】链表
阅读量:6984 次
发布时间:2019-06-27

本文共 6611 字,大约阅读时间需要 22 分钟。

1.链接点

链接点核心思想:

链接点中包含一个数据域和一个指针域。其中数据域用来包装数据,而指针域用来指向下一个链接点。
链接点模型:

package cn.deu;public class Link {		//数据域	    private long data;	    	    //指针域	    private Link next;	    		public Link(long data) {			this.data = data;		}		public long getData() {			return data;		}		public void setData(long data) {			this.data = data;		}		public Link getNext() {			return next;		}		public void setNext(Link next) {			this.next = next;		}	    }
链接点测试:
package en.edu.Test;import cn.deu.Link;public class TestLink {	public static void main(String[] args) {			Link link1=new Link(10);			Link link2=new Link(45);			Link link3=new Link(360);			Link link4=new Link(1);						link1.setNext(link2);			link2.setNext(link3);			link3.setNext(link4);				System.out.println(link1.getData());	System.out.println(link1.getNext().getData());	System.out.println(link1.getNext().getNext().getData());	System.out.println(link1.getNext().getNext().getNext().getData());	}}结果:10453601

2.链表

链表核心思想:

链表中只包含一个数据项,即对第一个链接点的引用
链表模型:
package cn.deu;//其实java的指针就是"引用"而已public class LinkList {		private Link first=new Link(-1);				//思路:一个首链接点,每添加一个新链接点		//将新链接点的指针指向首链接点的指针所指向的对象		//之后将首链接点的指针指向新连接点对象		public void insert(long value){			Link link1=new Link(value);			if(first.getNext()==null){				first.setNext(link1);			}else{				link1.setNext(first.getNext());				first.setNext(link1);			}		}				public void displayAll(){			Link current =first;			while(current.getNext()!=null){				if(current!=first){		System.out.println("当前数据:"+current.getData());				}	System.out.println("链接的下一个数据"+current.getNext().getData());				current=current.getNext();			}		}}
链表测试类:
package en.edu.Test;import cn.deu.LinkList;public class TestLinkList {		public static void main(String[] args) {		LinkList linklist=new LinkList();		linklist.insert(1);		linklist.insert(5);		linklist.insert(6);		linklist.insert(9);		linklist.displayAll();	}}/* * 结果: 链接的下一个数据9当前数据:9链接的下一个数据6当前数据:6链接的下一个数据5当前数据:5链接的下一个数据1 */

3.查找指定节点

模型:

package cn.deu;//其实java的指针就是"引用"而已public class LinkList {		private Link first=new Link(-1);				//思路:一个首链接点,每添加一个新链接点		//将新链接点的指针指向首链接点的指针所指向的对象		//之后将首链接点的指针指向新连接点对象		public void insert(long value){			Link link1=new Link(value);			if(first.getNext()==null){				first.setNext(link1);			}else{				link1.setNext(first.getNext());				first.setNext(link1);			}		}				public void displayAll(){			Link current =first;			while(current.getNext()!=null){				if(current!=first){	System.out.println("当前数据:"+current.getData());				}	System.out.println("链接的下一个数据"+current.getNext().getData());				current=current.getNext();			}		}		//查找节点		public Link find(long key){			Link current=first.getNext();			while(current.getData()!=key){				if(current.getNext()==null){					return null;				}				current=current.getNext();			}						return current;						}}
测试:
package en.edu.Test;import cn.deu.LinkList;public class TestLinkList {		public static void main(String[] args) {		LinkList linklist=new LinkList();		linklist.insert(1);		linklist.insert(5);		linklist.insert(6);		linklist.insert(9);		if(linklist.find(5)!=null){          System.out.println("找到节点,数据为:"+linklist.find(5).getData());		}			}}

结果:找到节点,数据为:5

4.添加指定节点

思路:

插入节点到指定位置(insert方法重载),
新加入的节点的下一个是原来节点的下一个,
当前节点的下一个设为新加入的。

public void insert(long value,int pos){	boolean flag=true;		Link current=first.getNext();		while(current.getData()!=pos){			if(current.getNext()==null){				flag=false;				System.out.println("插入失败");				break;			}			current=current.getNext();		}		if(flag==true){			Link InsertNum=new Link(value);			//新加入的节点的下一个是原来节点的下一个			InsertNum.setNext(current.getNext());			//当前节点的下一个设为新加入的			current.setNext(InsertNum);		    	System.out.println("插入成功!");		}}
测试:
package en.edu.Test;import cn.deu.LinkList;public class TestLinkList {		public static void main(String[] args) {		LinkList linklist=new LinkList();		linklist.insert(1);		linklist.insert(5);		linklist.insert(6);		linklist.insert(9);		linklist.displayAll();		/*		 * 结果:		 链接的下一个数据9		当前数据:9		链接的下一个数据6		当前数据:6		链接的下一个数据5		当前数据:5		链接的下一个数据1		 */		//将数据插入到5后面		linklist.insert(10, 5);		linklist.displayAll();		System.out.println("-------------------------");		//将数据插入到110后面(没有110,会失败)		linklist.insert(10, 110);		linklist.displayAll();		/*		* 结果:		插入成功!		链接的下一个数据9		当前数据:9		链接的下一个数据6		当前数据:6		链接的下一个数据5		当前数据:5		链接的下一个数据10		当前数据:10		链接的下一个数据1		-------------------------		插入失败		链接的下一个数据9		当前数据:9		链接的下一个数据6		当前数据:6		链接的下一个数据5		当前数据:5		链接的下一个数据10		当前数据:10		链接的下一个数据1 		*/	}}
5.删除指定节点

//删除节点//思路:将要删除节点的前一个节点的next指向要删除节点的nextpublic void delete(long key){	boolean flag=true;	Link current=first.getNext();	while(current.getNext()!=null&¤t.getNext().getData()!=key){			current=current.getNext();			if(current.getNext()==null){				flag=false;				System.out.println("删除失败!");				break;			}	}	if(flag==true){		current.setNext(current.getNext().getNext());		//中间那个节点被丢掉后,Java的垃圾回收器就会自动回收			System.out.println("删除成功!");		}	}
测试:
package en.edu.Test;import cn.deu.LinkList;public class TestLinkList {		public static void main(String[] args) {		LinkList linklist=new LinkList();		linklist.insert(1);		linklist.insert(10);		linklist.insert(5);		linklist.insert(6);		linklist.insert(9);		linklist.displayAll();		System.out.println("-------------------------");		linklist.delete(10);		linklist.displayAll();		System.out.println("-------------------------");		linklist.delete(110);		linklist.displayAll();	}}
结果:
链接的下一个数据9
当前数据:9
链接的下一个数据6
当前数据:6
链接的下一个数据5
当前数据:5
链接的下一个数据10
当前数据:10
链接的下一个数据1
-------------------------
删除成功!
链接的下一个数据9
当前数据:9
链接的下一个数据6
当前数据:6
链接的下一个数据5
当前数据:5
链接的下一个数据1
-------------------------
删除失败!
链接的下一个数据9
当前数据:9
链接的下一个数据6
当前数据:6
链接的下一个数据5
当前数据:5
链接的下一个数据1

6.比较链表与顺序表

package en.edu.Test;import java.text.SimpleDateFormat;import java.util.Date;import cn.deu.LinkList;import cn.deu.MyArray;public class TestLinkAndList {	public static void main(String[] args) {			//构建链表		Date date1=new Date();		LinkList linkList=new LinkList();		for (int i = 0; i < 100000; i++) {			linkList.insert(i);		}		Date date2=new Date();		System.out.println(date2.getTime()-date1.getTime());						//构建顺序表(从小到大)		date1=new Date();		MyArray ma=new MyArray(100000);		for (int i = 0; i < 100000; i++) {			ma.insert(i);		}		date2=new Date();		System.out.println(date2.getTime()-date1.getTime());		date1=new Date();		linkList.delete(11111);		date2=new Date();		System.out.println(date2.getTime()-date1.getTime());				date1=new Date();		ma.delete(11111);		date2=new Date();		System.out.println(date2.getTime()-date1.getTime());	}}
结果:
26
4367
删除成功!
13
45
对比结果:
链表进行插入删除比较快捷,但是查找比较慢
顺序表查找起来和修改起来比较好,但是插入删除比较慢。
比如公司的职员表经常发生变化,最好使用链表,因为插入删除比较快捷。
若表是固定的,就使用顺序表即可。

转载请注明出处:

你可能感兴趣的文章
线程中死锁的demo
查看>>
canvas-7globleCompositeOperation.html
查看>>
英语发音规则---H字母
查看>>
alpha冲刺9
查看>>
spring学习之spring 插件 for eclipse
查看>>
dispaly、position、float之间的关系与相互作用
查看>>
MyEclipse加入jquery.js文件missing semicolon的错误
查看>>
axis1.4生成客户端
查看>>
来自工程师的8项Web性能提升建议
查看>>
system类
查看>>
sqlmap基本命令
查看>>
计时器
查看>>
迎接“云”时代的全面到来
查看>>
论“性能需求分析”系列专题(一)之 性能需求剖析
查看>>
Effective 笔记
查看>>
Vim配置文件(全平台可用)2012-05-01版
查看>>
JPA概要
查看>>
PHP框架 Phalcon 1.0.0 beta发布,实测性能强劲
查看>>
程序集信息设置.net
查看>>
seajs 的研究二 -- 无题
查看>>