如果想要保存多个对象,我们可以用对象数组,想要保存多个任意对象,可以用Object型的数组,但是,数组是一个定长的线性结构,一旦我们内容过多或过少,都有可能造成空间的浪费,所以,我们就定义一个不固定长度的数组,有多少数据就保存多少数据,下面是用JAVA实现的双向链表节点结构:
package www.bit.java; interface Link{ boolean Add(Object obj); //增加结点 boolean remove(int index); //删除结点 int length(); //获取长度 int contains(Object obj); //查看结点是否存在 Object[] toArrary(); //获取结点 boolean set(int index,Object newElement); //改变结点数据 Object get(int intdex); //根据索引查找 void clear(); //清空链表 void printLink(); //打印链表 } class LinkImpl implements Link{ private Node first; private Node last; private int size=0; private class Node{ private Node per; private Object data; private Node next; private Node(Node per, Object data, Node next) { super(); this.per = per; this.data = data; this.next = next; } } public int getSize() { return this.size; } @Override public boolean Add(Object obj) { Node temp=this.last; Node newNode=new Node(temp, obj, null); if(this.first==null) { this.first=newNode; this.last=newNode; }else { temp.next=newNode; this.last=newNode; } this.size++; return true; } @Override public boolean remove(int index) { if(!isIndex(index)) return false; //Node node=node(index); if(index==0) { if(this.first==this.last) { this.first=null; this.last=null; this.size--; return true; } Node temp=this.first; this.first=temp.next; temp.next=null; this.first.per=null; this.size--; return true; }else if(index==size-1) { Node temp1=this.last; this.last=temp1.per; temp1.per=null; this.last.next=null; this.size--; return true; } Node temp=this.first; for(int i=0;i<index;i++) { temp=temp.next; } temp.next.per=temp.per; temp.per.next=temp.next; temp.next=null; temp.per=null; this.size--; return true; } @Override public int length() { return this.size; } @Override public int contains(Object obj) { int index=0; Node temp; if(obj==null) { for(temp=this.first;temp!=null;temp=temp.next) { if(temp.data==null) return index; index++; } }else { for(temp=this.first;temp!=null;temp=temp.next) { if(temp.data==obj) return index; index++; } } return -1; } @Override public Object[] toArrary() { Object[] result=new Object[this.size]; int i=0; for(Node temp=first;temp!=null;temp=temp.next) { result[i++]=temp.data; } return result; } @Override public boolean set(int index, Object newElement) { if(!isIndex(index)) return false; Node cur=this.first; for(int i=0;i<index;i++) { cur=cur.next; } cur.data=newElement; return true; } @Override public Object get(int intdex) { if(!isIndex(intdex)) return null; if(intdex > this.size/2) { int i=size-1; Node temp=this.last; for(i=size-1;i < intdex;i-- ) { temp=temp.per; } return temp.data; }else if(intdex < this.size/2) { int i=0; Node temp=this.first; for(i=0;i<intdex;i++) { temp=temp.next; } return temp.data; } return null; } private boolean isIndex(int index) { return (index >= 0) && (index < this.size); } @Override public void clear() { Node temp,temp1; for(temp=this.first;temp!=null;temp=temp1.next) { temp1=temp; temp.next=null; temp.per=null; } this.size=0; this.first=this.last=null; } @Override public void printLink() { Object[] result=this.toArrary(); for(Object obj:result) { System.out.println(obj); } } } public class Test{ public static void main(String[] args) { Link link=new LinkImpl(); link.Add("火车头"); link.Add("车厢1"); link.Add("车厢2"); link.Add("车厢3"); link.printLink(); System.out.println(link.length()); System.out.println("Add********************"); System.out.println(link.contains("火车头")); System.out.println(link.contains("车厢2")); System.out.println(link.contains("车厢3")); System.out.println(link.contains("车厢4")); System.out.println("Find*******************"); System.out.println(link.get(0)); System.out.println(link.get(1)); System.out.println(link.get(3)); System.out.println(link.get(4)); System.out.println("Get*********************"); System.out.println(link.set(0, "新加车厢")); System.out.println(link.set(3, "新加车厢3")); System.out.println(link.set(2, "新加车厢2")); link.printLink(); System.out.println(link.length()); System.out.println("Set**********************"); System.out.println(link.remove(0)); System.out.println(link.remove(2)); System.out.println(link.remove(3)); link.printLink(); System.out.println(link.length()); System.out.println("Remove*********************"); System.out.println(link.set(0, "新加车厢")); System.out.println(link.set(3, "新加车厢")); System.out.println(link.remove(0)); System.out.println(link.remove(1)); link.printLink(); System.out.println(link.length()); System.out.println("****************************"); System.out.println(link.contains("火车头")); link.printLink(); System.out.println(link.length()); link.clear(); link.printLink(); System.out.println("******************"); System.out.println(link.length()); link.printLink(); } }