(Java)Java双向链表实现(数据结构七)

1.迭代器接口实现

package com.zhaochao;

public interface Iterator<E> {
	 boolean  hasNext();
	 E        next();
	 boolean  delete();
	 boolean  modify(E e);
	 int      index();
}

2.异常类实现

package com.zhaochao;

public class IndexOutOfBoundsException extends RuntimeException {
	 private static final long serialVersionUID = 234122996006267687L;

	    /**
	     * Constructs an <code>IndexOutOfBoundsException</code> with no
	     * detail message.
	     */
	    public IndexOutOfBoundsException() {
	        super();
	    }

	    /**
	     * Constructs an <code>IndexOutOfBoundsException</code> with the
	     * specified detail message.
	     *
	     * @param   s   the detail message.
	     */
	    public IndexOutOfBoundsException(String s) {
	        super(s);
	    }
}


3.双向链表实现

package com.zhaochao;

import java.util.LinkedList;

public class DLinkList<E> {
	
	transient int length;
	Node<E> head;
	Node<E> tail;
	
	public DLinkList(){
		
	}
	public Iterator<E> iterator(){
		return new DLinkIterator();
	}
	public int size(){
		return length;
	}
	private class DLinkIterator implements Iterator  {
		
		transient int nowIndex=0;
		public DLinkIterator(){
			
		}
		@Override
		public boolean hasNext() {
			// TODO Auto-generated method stub
			return nowIndex<length;
		}

		@Override
		public E next() {
			// TODO Auto-generated method stub
			Node<E> node=getNode(nowIndex);
			nowIndex++;
			return node.date;
		}

		@Override
		public boolean delete() {
			// TODO Auto-generated method stub
			deleteIndex(nowIndex);
			return false;
		}

		@Override
		public boolean modify(Object e) {
			// TODO Auto-generated method stub
			Node<E> node=getNode(nowIndex);
			node.date=(E) e;
			return true;
		}

		@Override
		public int index() {
			// TODO Auto-generated method stub
			return nowIndex;
		}
		
		
	}
	public void add(E e){
		addLast(e);
	}
	
	public void add(int index, E e){
		checkIndex(index);
		if(index==0){
			addFrist(e);
		}else if(index==length-1){
			addLast(e);
		}else{
			Node<E> tempPre=getNode(index-1);
			Node<E> tempNext=getNode(index);
			Node<E> node=new Node(tempPre,e,tempNext);
			tempPre.next=node;
			tempNext.pre=node;
			length++;
		}
		
	}
	
	
	public void deleteIndex(int index){
		checkIndex(index);
		if(index==0){
			deleteFirst();
		}else if(index==length-1){
			deleteLast();
		}else{
			Node<E> tempPre=getNode(index-1);
			Node<E> tempNext=getNode(index+1);
			tempPre.next=tempNext;
			tempNext.pre=tempPre;
			length--;
		}
	}
	private boolean deleteFirst(){
		head=head.next;
		length--;
		return true;
	}
	private boolean deleteLast(){
		tail=tail.pre;
		length--;
		return true;
	}
	
	
	private Node<E> getNode(int index){
		checkIndex(index);
		Node<E> node;
		if(index<length>>1){
			node=head;
			for(int i=0;i<index;i++)
				node=node.next;
		}else{
			node=tail;
			for(int i=length-1;i>index;i--)
				node=node.pre;
		}
		return node;
	}
	
	private void checkIndex(int index){
		if(index<0 ||index>=length)
			throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
	}
	
	private String outOfBoundsMsg(int index){
		return "index:"+index+" length:"+size();
	}
	private boolean addFrist(E e){
		Node<E> h=head;
		Node<E> node=new Node(null,e,h);
		head=node;
		if(h==null){
			tail=node;
		}else{
			h.pre=node;
		}
		length++;
		return true;
	}
	
	private boolean addLast(E e){
		Node<E> l=tail;
		Node<E> node=new Node(l,e,null);
		tail=node;
		if(l==null){
			head=node;
		}else{
			l.next=node;
		}
		length++;
		return true;
	}
	
	private static class Node<E>{
		E date;
		Node<E> pre;
		Node<E> next;
		Node(E e){
			this.date=e;
		}
		Node(Node<E> pre,E e,Node<E> next){
			this.pre=pre;
			this.date=e;
			this.next=next;
		}
	}
	
	
}

4.测试

package com.zhaochao;


public class main {


	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		
		DLinkList<Test> dl=new DLinkList<Test>();
		Test t=new Test();
		for(int i=0;i<10;i++)
			dl.add(t);
		
		Iterator it=dl.iterator();
		while(it.hasNext())
			System.out.println(it.next());
	}

}


class Test{
	public static int a=0;
	public String toString(){
		return String.valueOf(a++);
	}
}

5.测试结果 

0
1
2
3
4
5
6
7
8
9


posted @ 2013-10-11 15:38  赵侠客  阅读(207)  评论(0编辑  收藏  举报