如果想要保存多个对象,我们可以用对象数组,想要保存多个任意对象,可以用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();
}
}