java中的链表
链表就是一个容器,用来放各种数据和对象的。假如说一棵果树,结了很多的果子,必须要有容器去装,此时我们需要的篮子就想当于java中的list了,果子就相当于各种数据或对象。
java中的具体实现已经进行封装,相比数组队列它在插入和删除方面占有优势,还有一个优点就是有序。
虽然如此,但是很多时候不够灵活,它的缺点是在不是只做遍历的结构中要访问链表中的某个元素是很慢的,因为需要从链表头一直到查询到所需要的元素,所以链表是用来做遍历的。
链表不同于以前我们学过的队列或数组,它是非线性的,即不是在内存中连续存储的。
由于学过一部分C++,当中老师有介绍过链表,我以为这两种不同的编程语言在某些时候还是挺相似的。想法和大概框架差不多。不同的是C++是用指针实现的,而java中并没有指针。
再者在进行删除部分时,C++中有析构函数进行内存释放,而java中我们不用去管这些,java中的垃圾回收机制自然会帮我们做这件事。
既然叫做链表,那么它自然与链子有关系,像链条那样,但它却没有实在的链接,只是地址的指向。
对于链表,在写程序时,不能光在脑子里想象,要将它画出来,将之具体化,图像化,你会发现好理解很多。
关于链表中的方法在这里不做多说,直接在代码中实现。
package 链表;
/*
* 定义一个Node类
*/
public class Node {
//定义Node类对象的next属性
Node next;
//定义Object类的数据变量属性
Object data;
}
package 链表;
public class MyLink {
private Node root;//定义根节点
private Node tail;//定义指向尾部的节点
private int length;//定义长度属性
public static void main(String [] args){
//实例化一个MyLink类对象
MyLink link = new MyLink();
for(int i = 0;i<10;i++){
link.add("student:"+i);
}
for(int i = 0;i<10;i++){
System.out.println(link.get(i));
}
link.insert(0, "a");
link.insert(3,"b");
for(int i = 0;i<10;i++){
System.out.println(link.get(i));
}
System.out.println("========");
System.out.println("要移除的数据: "+link.remove(0));
for(int i = 0;i<10;i++){
System.out.println(link.get(i));
}
}
/**
* 添加方法,将元素添加到链表
* @param obj
*/
public void add(Object obj){
//实例化一个Node类的对象
Node node = new Node();
//将要添加的值赋给date属性
node.data=obj;
//判断链表是否为空,若为空则将要添加的元素添加到表头
if(root==null){
root=node;
tail=node;
}else{
//如果不为空,则将链表尾部下一个位置指向node的地址
tail.next=node;
tail=node;
}
//添加完成则长度length+1
length++;
}
/*
* 获取到指定位置的元素并返回
*/
public Object get(int index){
//判断数据是否越界
if(index<0||index>=length){
return new java.lang.ArrayIndexOutOfBoundsException("超出队列范围!");
}
//遍历链表中的元素,直到找到index位置为止,并返回data
Node temp=root;
for(int i=0;i<index;i++){
temp=temp.next;
}
return temp.data;
}
/*
* 移除指定位置的元素,并返回该元素
*/
public Object remove(int index){
//判断是否超出范围
if(index<0||index>=length){
return new java.lang.ArrayIndexOutOfBoundsException("超出队列范围!");
}
//当只有表头一个元素时,先将元素的值保存,再将表头置空
if(length==1){
length--;
Object obj=root.data;
root=null;
return obj;
}
length--;
//删除表头
if(index==0){
Object obj=root.data;
root=root.next;
return obj;
}
Node temp = root;
//删除除表头外的元素
for(int i=0;i<index-1;i++){
temp=temp.next;
}
Object obj=temp.next.data;
temp=temp.next.next;
return obj;
}
public void insert(int index ,Object obj){
if(index<0||index>=length){
//抛出一个异常
throw new java.lang.ArrayIndexOutOfBoundsException("超出队列范围!");
}
Node node=new Node();
node.data=obj;
//插入元素到表头位置
if(index==0){
node.next=root;
root=node;
length++;
}
Node temp=root;
//将元素插入到除表头以外的其他位置
for(int i=0;i<index-1;i++){
temp=temp.next;
}
Node temp1=new Node();
temp1=temp.next;
temp.next=node;
node.next=temp1;
length++;//长度加1
}
}
运行结果:
student:0
student:1
student:2
student:3
student:4
student:5
student:6
student:7
student:8
student:9
a
student:0
student:1
b
student:2
student:3
student:4
student:5
student:6
student:7
========
要移除的数据: a
student:0
student:1
b
student:2
student:3
student:4
student:5
student:6
student:7
student:8