代码:
import java.util.Iterator;
public class DoublyLinkedListSentinel implements Iterable<Integer>{
private Node head;//头哨兵
private Node tail;//尾哨兵
static class Node{
Node prev;
int value;
Node next;
Node(Node prev, int value, Node next){
this.prev = prev;
this.value = value;
this.next = next;
}
}
public void DoublyLinkedListSentinel() {
head = new Node(null, 666, null);
tail = new Node(null, 888, null);
head.next = tail;
tail.prev = head;
}
//根据索引查找节点
private Node findNode(int index){
int i=-1;
for(Node p=head;p!=tail;p=p.next,i++){
if(i==index){
return p;
}
}
return null;
}
//在头部插入值
public void addFirst(int value){
insert(0,value);
}
//尾部添加
public void addLast(int value){
Node prev=tail.prev;
Node added = new Node(prev, value, tail);
prev.next=added;
tail.prev=added;
}
//删除第一个节点
public void removeFirst(){
remove(0);
}
//在尾部删除
public void removeLast(){
Node removed = tail.prev;
if(removed==head)//头哨兵不能删
throw illegal(0);
Node prev=removed.prev;
prev.next=tail;
tail.prev=prev;
}
//根据索引插入值
public void insert(int index,int value){
//index为0时,findNode(index-1)的值为666,不是空
Node prev= findNode(index-1);//找到要插入索引的前一个节点
if(prev==null) {
throw illegal(index) ;
}
Node next=prev.next;
Node inserted=new Node(prev,value,next);
prev.next=inserted;//指向新节点
next.prev=inserted;
}
//按索引删除元素
public void remove(int index){
Node prev=findNode(index-1);
//超出索引
if(prev==null)
throw illegal(index);
Node removed=prev.next;
if(removed==tail)//尾哨兵不能删
throw illegal(index);
Node next=removed.next;
prev.next=next;
next.prev=prev;
}
@Override
public Iterator<Integer> iterator() {
return new Iterator<Integer>(){
Node p=head.next;
@Override
public boolean hasNext(){
return p!=tail;
}
public Integer next(){
int value=p.value;
p=p.next;
return value;
}
};
}
private IllegalArgumentException illegal(int index) {
throw new IllegalArgumentException(String.format("索引[%d]不存在", index));
}
}