Java基於雙向鏈表實現列表結構(演算法源碼)

來源:互聯網
上載者:User

/* 高手之作,本人謹以收藏者身份共用源碼,供大家參考之! */

 

/*
 * 列表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); }
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.