【Java数据结构】链表

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());
	}
}
结果:
10
45
360
1


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指向要删除节点的next
public 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

对比结果:
链表进行插入删除比较快捷,但是查找比较慢
顺序表查找起来和修改起来比较好,但是插入删除比较慢。

比如公司的职员表经常发生变化,最好使用链表,因为插入删除比较快捷。
若表是固定的,就使用顺序表即可。

转载请注明出处:http://blog.csdn.net/acmman/article/details/50444792

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值