【Java】双向链表的实现

双向链表,每个节点有一个属性值,一个指向前一个节点prev,一个指向后一个节点next,



Link接口:

public interface Link {
	boolean add(Object obj);	//添加
	boolean remove(Object obj); //删除
	int length();				//求长度
	Object[] toArray();			//转换为数组
	boolean contains(Object obj);//包含
	int indexOf(Object obj);	//查找第几个
	boolean set(int index,Object newElement);//修改
	Object get(int index);		//返回index的节点
	void clear();				//清空
	void print();
}

实现Link接口的LinkImpl类:

public class LinkImpl implements Link {
	private Node first;
	private Node last;
	private int size=0;
	
	private class Node{
		Object item;
		private Node prev;
		private Node next;
		private Node(Object item, Node prev, Node next) {
			this.item = item;
			this.prev = prev;
			this.next = next;
		}
	}
	@Override
	public boolean add(Object 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, Object newElement) {
		if(index>=this.size||index<0) {
			return false;
		}
		Node cur = node(index);
		cur.item=newElement;
		return true;
	}

	@Override
	public Object 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();
	}
}

产生Link的工厂类:

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

Test主类:

public class Test {
	public static void main(String[] args) {
		Link list = Factory.getLinkList();
		list.add("一");
		list.add("二");
		list.add("三");
		list.add("四");
		list.add("五");
		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("四");
		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();
	}
}

测试结果:



猜你喜欢

转载自blog.csdn.net/qq_35402412/article/details/79935456