1. 程式人生 > >使用鏈表實現無序符號表SequentialSearchST

使用鏈表實現無序符號表SequentialSearchST

print 打了 tex alt println 刪除 spa equals test

這裏的關鍵問題是理解鏈表以及鏈表的循環(遍歷)

鏈表實際上就是一個內部類,而且是一個遞歸結構。未初始化時,鏈表本身為null(實際上就是在內存中沒有分配空間),其中的next也是鏈表,也是null。

first = new Node(key, value, first);

Node 鏈表first就被分配了地址,但是first.next仍然時null;

 1 class Node<Item> {
 2         Item item;
 3         Node next;
 4     }
 5     Node<Integer> first = new Node<>();
6 Node<Integer> second = new Node<>(); 7 first.item = 1; 8 second.item = 2; 9 first.next = second; 10 System.out.println(second); 11 second = first.next; 12 System.out.println(first.next); 13 System.out.println(second); 14 } 15 /* 16 [email protected]
/* */ 17 [email protected] 18 [email protected] 19 */

從這個測試中可以看出,first.next = second;是給鏈表結點賦值指向下一個鏈表結點。second = first.next;是給鏈表結點賦上結點的值(或為null賦位置址;或改變結點的位置),這個在循環中是關鍵。

這兩者區別是,前者相當於用一個箭頭將自己和另一個結點勾連起來,後者相當於將自己直接變成另一個結點。

 1 private Node first;
 2 private class Node {
 3     Key key;
 4
Value value; 5 Node next; 6 //構造函數給鏈表節點初始化(賦值) 7 public Node(Key key, Value value1, Node next) { 8 this.key = key; //加this是內部類Node的值,另一個是初始化引入的值,同名所以需要區分 9 value = value1; //不同名沒有沖突(歧義)就可以不加 10 this.next = next; 11 } 12 } 13 14 /*******最重要:插入、獲取、刪除符號表中的值***********************/ 15 public void put(Key key, Value value) { 16 for (Node x = first; x != null; x = x.next) { 17 if (key.equals(x.key)) { 18 x.value = value; 19 return; 20 } 21 } 22 first = new Node(key, value, first); 23 } 24 25 public Value get(Key key) { 26 for (Node x = first; x != null; x = x.next) { 27 if (key.equals(x.key)) { 28 return x.value; 29 } 30 } 31 return null; 32 }

首先註意:

新建的鏈表結點,都是初始化為null,而且程序運行,第一次運行到給first賦值的時候,first.next仍然是null;

for循環: x = x.next;

理解,等號左右兩邊的x結點是不一樣的,左邊就是新的結點,右邊的x.next是舊的結點的next,指向下一個結點。這個步驟就是將x按順序轉換到下一個結點,像順著打了很多結點的繩子一節一節向前走。

技術分享

註意小腳標。這是代表每次運行時,同一個first有不同的值,註意區分。

使用鏈表實現無序符號表SequentialSearchST