用java编写链表

来源:互联网 发布:工程类 网络类 编辑:程序博客网 时间:2024/06/03 20:02

接下来,我将对链表队列进行描述,链表队列与数组队列有很大的不同,两者因为在添加、插入、删除、获取这些方法中运用的思路不同,所以两者实现的效果也是不一样的。链表队列需要三个类,一个类用于定义链表的两个属性:内容和链表属性。内容为该位置存储的数据,链表属性指的是该链表对应的下一个链表,起一个指向的作用,可以理解为不同容器之间的连接物。这个类是这样的:

public class Link {

Object o;

Link next;

}

这就是一个链表类中有两个属性。接下来我们新建一个封闭的类调用通过调用链表的两个属性对实现对数据的存储。

public class MyLink {

//定义第一个链表,

Link root,present;

private int size=0;

//添加

public void add(Object o){

if(root==null){

//创建第一个链表

root=new Link();

//给第一个链表添加数据

root.o=o;

//记忆最后一个链表

present=root;

//长度加一

size++;

}

else{

//创建一个新的链表

Link next =new Link();

//给新的链表添加数据

next.o=o;

//连接上一个链表与新链表

present.next=next;

//记忆最后一个链表

present=next;

//长度加一

size++;

}

}

//获取链表(若要获取对应链表的数据只要在后面加.o即可)

public Link get(int index){

//创建一个新的链表

Link next=new Link();

//给链表赋予0位置的链表root

next=root;

//for循环,获取index位置上的数据

for(int i=0;i<index;i++){

next=next.next;

}

//返回index位置上的链表

return next; 

}

//获取长度

public int size(){

return size;

}

//删除

public void delect(int index){

if(index==0){

//连接

root=root.next;

}

else if(index==size-1){

//对倒数第二个的next属性进行初始化

get(index-1).next=null;

}

else{

//获取index位置前一个链表

Link next=get(index-1);

//将其连接到index位置后的一个链表

next.next=get(index+1);

}

size--;

}

//插入

public void insert(int index,Object o){

if(index==0){

//创建新的链表

Link next=new Link();

//给新的链表添加数据

next.o=o;

//进行连接

next.next=root;

//将新链表赋予root

root=next;

}

else if(index==size){

add(o);

}

else{

//创建新的链表

Link next1=new Link();

//给新的链表添加数据

next1.o=o;

//获取index位置前一个链表

Link next2=get(index-1);

//进行连接。(特别注意:先对后面进行连接,再对前面进行连接)

next1.next=get(index);

next2.next=next1;

}

size++;

}

}

同样这是一个封闭的方法,其他类可以通过创建该类的对象来实现该类中的方法。这个封闭的方法实现了一个链表队列的一些简单的操作:添加、获取、定向插入、定向删除、获取长度。写好这么一个类之后,需要我们再写一个类来对他进行检测:

public class Text2 {

public static void main(String[] args) {

//实例化一个数组队列ml

MyLink ml=new MyLink();

//给队列添加数据

for(int i=0;i<5;i++){

ml.add(i);

}

//获取数据

System.out.print("取到的数据是");

for(int i=0;i<ml.size();i++){

System.out.print("  "+ml.get(i).o);

}

System.out.println("");

//获取长度

System.out.println("此时长度为"+ml.size());

//插入

ml.insert(0,"a");

//获取长度

System.out.println("0位置插入后长度为"+ml.size());

//获取数据

System.out.print("0位置插入后取到的数据是");

for(int i=0;i<ml.size();i++){

System.out.print("  "+ml.get(i).o);

}

System.out.println("");

//删除

ml.delect(1);

//获取长度

System.out.println("1位置删除后长度为"+ml.size());

//获取数据

System.out.print("1位置删除后取到的数据是");

for(int i=0;i<ml.size();i++){

System.out.print("  "+ml.get(i).o);

}

System.out.println("");

}

}

运行后的结果为

取到的数据是  0  1  2  3  4

此时长度为5

0位置插入后长度为6

0位置插入后取到的数据是  a  0  1  2  3  4

1位置删除后长度为5

1位置删除后取到的数据是  a  1  2  3  4

接下来分析链表队列在时间复杂度和空间复杂度上的优缺点。链表结构在用索引调用索引对应的链表时,花费比较长的时间,但是在插入和删除时,不需要花费和数组队列那么多的时间。当然链表也是可以进行优化的。

链表和数组在空间复杂度和时间复杂度上各有利弊。因此遇到不同的情况我们可以采用不同的数据结构。

以上就是我对数据结构中数组队列和链表队列的一些比较肤浅的理解,欢迎各位大神与我分享经验,提出见解,谢谢。

0 0
原创粉丝点击