/* 高手之作,本人謹以收藏者身份共用源碼,供大家參考之! */
/*
* 列表ADT介面
*/
package dsa;
public interface List {
//查詢列表當前的規模
public int getSize();
//判斷列表是否為空白
public boolean isEmpty();
//返回第一個元素(的位置)
public Position first();
//返回最後一個元素(的位置)
public Position last();
//返回緊接給定位置之後的元素(的位置)
public Position getNext(Position p)
throws ExceptionPositionInvalid, ExceptionBoundaryViolation;
//返回緊靠給定位置之前的元素(的位置)
public Position getPrev(Position p)
throws ExceptionPositionInvalid, ExceptionBoundaryViolation;
//將e作為第一個元素插入列表
public Position insertFirst(Object e);
//將e作為最後一個元素插入列表
public Position insertLast(Object e);
//將e插入至緊接給定位置之後的位置
public Position insertAfter(Position p, Object e)
throws ExceptionPositionInvalid;
//將e插入至緊靠給定位置之前的位置
public Position insertBefore(Position p, Object e)
throws ExceptionPositionInvalid;
//刪除給定位置處的元素,並返回之
public Object remove(Position p)
throws ExceptionPositionInvalid;
//刪除首元素,並返回之
public Object removeFirst();
//刪除末元素,並返回之
public Object removeLast();
//將處於給定位置的元素替換為新元素,並返回被替換的元素
public Object replace(Position p, Object e)
throws ExceptionPositionInvalid;
//位置迭代器
public Iterator positions();
//元素迭代器
public Iterator elements();
}
/*
* 基於雙向鏈表實現列表結構
*/
package dsa;
public class List_DLNode implements List {
protected int numElem;//列表的實際規模
protected DLNode header, trailer;//哨兵:首節點+末節點
//建構函式
public List_DLNode() {
numElem = 0;//空表
header = new DLNode(null, null, null);//前端節點
trailer = new DLNode(null, header, null);//尾節點
header.setNext(trailer);//頭、尾節點相互連結
}
/**************************** 輔助方法 ****************************/
//檢查給定位置在列表中是否合法,若是,則將其轉換為*DLNode
protected DLNode checkPosition(Position p) throws ExceptionPositionInvalid {
if (null == p)
throw new ExceptionPositionInvalid("意外:傳遞給List_DLNode的位置是null");
if (header == p)
throw new ExceptionPositionInvalid("意外:前端節點哨兵位置非法");
if (trailer == p)
throw new ExceptionPositionInvalid("意外:尾結點哨兵位置非法");
DLNode temp = (DLNode)p;
return temp;
}
/**************************** ADT方法 ****************************/
//查詢列表當前的規模
public int getSize() { return numElem; }
//判斷列表是否為空白
public boolean isEmpty() { return (numElem == 0); }
//返回第一個元素(的位置)
public Position first() throws ExceptionListEmpty {
if (isEmpty())
throw new ExceptionListEmpty("意外:列表空");
return header.getNext();
}
//返回最後一個元素(的位置)
public Position last() throws ExceptionListEmpty {
if (isEmpty())
throw new ExceptionListEmpty("意外:列表空");
return trailer.getPrev();
}
//返回緊靠給定位置之前的元素(的位置)
public Position getPrev(Position p)
throws ExceptionPositionInvalid, ExceptionBoundaryViolation {
DLNode v = checkPosition(p);
DLNode prev = v.getPrev();
if (prev == header)
throw new ExceptionBoundaryViolation("意外:企圖越過列表前端");
return prev;
}
//返回緊接給定位置之後的元素(的位置)
public Position getNext(Position p)
throws ExceptionPositionInvalid, ExceptionBoundaryViolation {
DLNode v = checkPosition(p);
DLNode next = v.getNext();
if (next == trailer)
throw new ExceptionBoundaryViolation("意外:企圖越過列表後端");
return next;
}
//將e插入至緊靠給定位置之前的位置
public Position insertBefore(Position p, Object element)
throws ExceptionPositionInvalid {
DLNode v = checkPosition(p);
numElem++;
DLNode newNode = new DLNode(element, v.getPrev(), v);
v.getPrev().setNext(newNode);
v.setPrev(newNode);
return newNode;
}
//將e插入至緊接給定位置之後的位置
public Position insertAfter(Position p, Object element)
throws ExceptionPositionInvalid {
DLNode v = checkPosition(p);
numElem++;
DLNode newNode = new DLNode(element, v, v.getNext());
v.getNext().setPrev(newNode);
v.setNext(newNode);
return newNode;
}
//將e作為第一個元素插入列表
public Position insertFirst(Object e) {
numElem++;
DLNode newNode = new DLNode(e, header, header.getNext());
header.getNext().setPrev(newNode);
header.setNext(newNode);
return newNode;
}
//將e作為最後一個元素插入列表
public Position insertLast(Object e) {
numElem++;
DLNode newNode = new DLNode(e, trailer.getPrev(), trailer);
if (null == trailer.getPrev()) System.out.println("!!!Prev of trailer is NULL!!!");
trailer.getPrev().setNext(newNode);
trailer.setPrev(newNode);
return newNode;
}
//刪除給定位置處的元素,並返回之
public Object remove(Position p)
throws ExceptionPositionInvalid {
DLNode v = checkPosition(p);
numElem--;
DLNode vPrev = v.getPrev();
DLNode vNext = v.getNext();
vPrev.setNext(vNext);
vNext.setPrev(vPrev);
Object vElem = v.getElem();
//將該位置(節點)從列表中摘出,以便系統回收其佔用的空間
v.setNext(null);
v.setPrev(null);
return vElem;
}
//刪除首元素,並返回之
public Object removeFirst()
{ return remove(header.getNext()); }
//刪除末元素,並返回之
public Object removeLast()
{ return remove(trailer.getPrev()); }
//將處於給定位置的元素替換為新元素,並返回被替換的元素
public Object replace(Position p, Object obj)
throws ExceptionPositionInvalid {
DLNode v = checkPosition(p);
Object oldElem = v.getElem();
v.setElem(obj);
return oldElem;
}
//位置迭代器
public Iterator positions()
{ return new IteratorPosition(this); }
//元素迭代器
public Iterator elements()
{ return new IteratorElement(this); }
}