1. 程式人生 > >JAVA-三陣列實現雙向連結串列

JAVA-三陣列實現雙向連結串列

在嘗試使用連結法編寫一個散列表時遇到一個很大的問題 JAVA沒有連結串列和指標(lll¬ω¬)

忽然想起了之前學習過的在沒有指標的語言中實現連結串列的方法,試著實現了以下 程式碼如下

因為這裡需要多連結串列存入Array裡,因此這裡新建一個類用於儲存連結串列資訊

public class LinkList {
 /*
  * 連結串列數值說明:
  * -1:該key為空
  * -2:該key被刪除過
  */
 
 //主鍵
 public int[] Key;
 //前驅
 public int[] pre;
 //後驅
 public int[] next;
 
 //這裡不提供Get Set方法,在使用連結串列時切記先呼叫initLinkList進行初始化
//由於陣列長度不可變,因此初始化時需要傳入長度 public void initLinkList(int Length) { this.Key = new int[Length]; this.pre = new int[Length]; this.next = new int[Length]; for(int i=0;i<Length;i++) { this.Key[i] = -1; this.pre[i] = -1; this.next[i] = -1; } } }
//由於陣列長度不可變,因此陣列大小設定大一些以保證擁有足夠的空間
//注意,一旦刪除了某個元素那麼該元素所在的位置便改為-2 //連結串列插入操作 public int linkedListInsertion(int info,LinkList data) { //由於實際過程中並不會有太多衝突,因此採用線性的探查方法可以減少程式碼的複雜度 int index = -1; for (int i = 0; i < data.Key.length; i++) { if (data.Key[i] == -1 || data.Key[i] == -2) { if (data.Key[i] == -1) { //設定前驅 if
(i != 0) { data.pre[i] = i-1; }else { //表頭指向表尾 data.pre[i] = data.Key.length - 1; } //設定後驅動 if (i != data.Key.length - 1) { data.next[i] = i+1; }else { //表尾指向表頭 data.next[i] = 0; } index = i; }else { //刪除時僅對i的上一個後驅及下一個前驅進行更改,i的前後驅未變,因此無需更改 data.next[i - 1] = i; data.pre[i + 1] = i; } data.Key[i] = info; break; } } return index; } //搜尋操作 public int[] searchInfo(int Info,LinkList data) { ArrayList<Integer> resultArray = new ArrayList<Integer>(); for(int i = 0;i < data.Key.length;i++) { if (Info == data.Key[i]) { resultArray.add(i); } } int[] resultIndex = new int[resultArray.size()]; if (resultArray.size() == 0) { int[] nullResult = new int[1]; nullResult[0] = -1; return nullResult; }else { for(int z = 0;z<resultArray.size();z++) { resultIndex[z] = resultArray.get(z); } return resultIndex; } } //獲取前驅 public int getPre(int index,LinkList data) { if (index > 0 && index < data.Key.length) { return data.pre[index]; }else { return -1; } } //獲取後驅 public int getNext(int index,LinkList data) { if (index > 0 && index < data.Key.length) { return data.next[index]; }else { return -1; } } //下面兩個方法用於手動設定表頭表尾 public Boolean setPre(int KeyIndex,int PreIndex,LinkList data) { if (PreIndex > data.Key.length || PreIndex < 0) return false; if (KeyIndex > data.Key.length || KeyIndex < 0) return false; data.pre[KeyIndex] = PreIndex; return true; } public boolean setNext(int KeyIndex,int NextIndex,LinkList data) { if (NextIndex > data.Key.length || NextIndex < 0) return false; if (KeyIndex > data.Key.length || KeyIndex < 0) return false; data.next[KeyIndex] = NextIndex; return true; } //====================================== //刪除Key public boolean deleteList(int keyIndex,LinkList data) { if (keyIndex > data.Key.length || keyIndex < 0) return false; data.next[keyIndex - 1] = keyIndex + 1; data.pre[keyIndex + 1] = keyIndex - 1; data.Key[keyIndex] = -2; return true; }

測試結果如下: =進行初始賦值= 9 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 0 =進行刪除操作= 9 0 1 2 2 4 5 6 7 8 0 1 2 -2 4 5 6 7 8 9 1 2 4 4 5 6 7 8 9 0 =進行插入操作= 9 0 1 2 3 4 5 6 7 8 0 1 2 19 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 0

注意!!!! 這裡僅僅進行了最基本的測試,並不保證程式碼的可靠性,僅僅用於學習瞭解一種在未提供連結串列的語言中實現連結串列的方法