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