使用泛型实现之前用Object的双链表:点击打开链接
interface Linkpublic interface Link {
boolean add(T obj);//添加
boolean remove(T obj); //删除
int length();//求长度
Object[] toArray();//转换为数组
boolean contains(T obj);//包含
int indexOf(T obj);//查找第几个
boolean set(int index,T newElement);//修改
T get(int index);//返回index的节点
void clear();//清空
void print();
}
public class LinkImpl implements Link {
private Node first;
private Node last;
private int size=0;
private class Node{
T item;
private Node prev;
private Node next;
private Node(T obj, Node prev, Node next) {
this.item = obj;
this.prev = prev;
this.next = next;
}
}
@Override
public boolean add(T obj) {
if(this.first==null) {
this.first = new Node(obj,null,null);
this.last = this.first;
this.size++;
return true;
}
Node newNode = new Node(obj,this.last,null);
this.last.next = newNode;
this.last = newNode;
this.size++;
return true;
}
@Override
public int length() {
return this.size;
}
@Override
public Object[] toArray() {
if(this.size==0) {
return null;
}
Object[] objects =new Object[this.size];
Node cur = this.first;
for(int i=0;i
objects[i]=cur.item;
cur=cur.next;
}
return objects;
}
@Override
public boolean contains(Object obj) {
return indexOf(obj)!=-1;
}
@Override
public int indexOf(Object obj) {
int index = 0;
Node cur = this.first;
if(obj==null) {
while(cur!=null) {
if(cur.item==null) {
return index;
}
cur=cur.next;
index++;
}
}else {
while(cur!=null) {
if(obj.equals(cur.item)) {
return index;
}
cur=cur.next;
index++;
}
}
return -1;
}
private Node node(int index) {
Node cur = this.first;
if(index>1)) {
for(int i=0;i
cur=cur.next;
}
}else {
cur = this.last;
for(int i=this.size-1;i>index;i--) {
cur = cur.prev;
}
}
return cur;
}
@Override
public boolean set(int index, T newElement) {
if(index>this.size||index<0) {
return false;
}
Node cur = node(index);
cur.item=newElement;
return true;
}
@Override
public T get(int index) {
if(index>=this.size||index<0) {
return null;
}
Node cur = node(index);
return cur.item;
}
@Override
public void clear() {
Node cur = this.first;
while(cur!=null) {
Node next = cur.next;
cur.item=null;
cur.prev=null;
cur.next=null;
cur=next;
}
this.first=null;
this.last=null;
this.size=0;
}
@Override
public boolean remove(Object obj) {
int index = indexOf(obj);
if(index==-1) {
return false;
}
Node div = this.first;
for(int i=0;i
div = div.next;
}
if(div==this.first) {
if(div==this.last) {
this.first=this.last=null;
}else {
Node tmp = this.first;
this.first = tmp.next;
this.first.prev = null;
tmp.next = null;
tmp = null;
}
}
else if(div==this.last) {
Node tmp = this.last;
this.last = tmp.prev;
this.last.next = null;
tmp.prev = null;
tmp = null;
}else {
div.prev.next=div.next;
div.next.prev=div.prev;
div.prev=null;
div.next=null;
}
this.size--;
return true;
}
@Override
public void print() {
Node cur = this.first;
while(cur!=null) {
System.out.print(cur.item+" ");
cur=cur.next;
}
System.out.println();
}
}
class Factorypublic class Factory {
private Factory() {
}
public static Link getLinkList() {
return new LinkImpl();
}
}
class Testpublic class Test {
public static void main(String[] args) {
Link list = Factory.getLinkList();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
list.print();
System.out.println(list.get(-1));
System.out.println(list.get(0));
System.out.println(list.get(1));
System.out.println(list.get(5));
int index=list.indexOf(4);
System.out.println("四在第几个位置:"+index);
System.out.println("length:"+list.length());
System.out.println(list.remove(list.get(7)));
System.out.println(list.remove(list.get(2)));
System.out.println(list.remove(list.get(0)));
list.print();
Object[] objects = list.toArray();
for(int i=0;i
System.out.print(objects[i]+" ");
}
System.out.println();
System.out.println("##########");
list.clear();
System.out.println(list.get(0));
list.print();
}
}