0
点赞
收藏
分享

微信扫一扫

【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



对比结果:


链表进行插入删除比较快捷,但是查找比较慢


顺序表查找起来和修改起来比较好,但是插入删除比较慢。



比如公司的职员表经常发生变化,最好使用链表,因为插入删除比较快捷。


若表是固定的,就使用顺序表即可。

举报

相关推荐

0 条评论