Java-双链表(泛型)

使用泛型实现之前用Object的双链表:点击打开链接


interface Link<T>

public interface Link<T> {
	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<T> implements Link<T> {
	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<this.size;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<(this.size>>1)) {
			for(int i=0;i<index;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<index;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 Factory

public class Factory {
	private Factory() {
	}
	public static <T> Link<T> getLinkList() {
		return new LinkImpl<T>();
	}
}

class Test

public class Test {
	public static void main(String[] args) {
		Link<Integer> 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<objects.length;i++) {
			System.out.print(objects[i]+" ");
		}
		System.out.println();
		System.out.println("##########");
		list.clear();
		System.out.println(list.get(0));
		list.print();
	}
}




原文地址:https://www.cnblogs.com/yongtaochang/p/13615348.html