單向鏈結串列

節點

有二個屬性,data與next,next存放下一個節點的記憶體位址,data放存放資料。

重要變數說明

head頭節點,不存任何資料,功用是指向串列中第一個節點。

img

上圖中,head.next指向的節點是第一個節點,也是最後一個節點,最後一個節點指向null。

新增節點

在最後一個節點後面,新增節點。

變數說明

由於head頭節點的作用是永遠指向串列中第一個節點,不能移動。
所以需要有一個輔助變數curNode,移動到每一個節點,直到找到節點的next為null。
最後一個節點的next指向null就是最後一個節點。

cur是current縮寫,中文是「目前」指向的節點。

第一次新增

目前沒有任何節點,只有一個head頭節點,head的next是null。

輔助變數curNode移動到head頭節點。
img

把head的next,指向新的節點。
新節點的next預設為null,詳情請看Node類別。
img

不是第一次新增

輔助變數curNode移動到head頭節點。

移動到每一個節點,直到找到最後一個節點的next為null。

把最後一個節點的next指向「新節點」記憶體位址。

img

程式碼

curNode一開始移動到head,如果第一次新增,是不會有其它節點,所以新增都是指向head。

img

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class MyLinkedList {
  Node head;
  public MyLinkedList() {
    head = new Node();
  }
  public void add(Node newNode) {
    // 輔助變數curNode移動到head
    Node curNode = head;
    while (true) {
      // 判斷是不是最後一個節點
      if (curNode.next == null) {
        // 找到就離開迴圈,不要再移動
        // 目前的curNode就是最後一個節點
        break;
      }
      // 若不是最後一個節點,curNode輔助變數移動到下一個節點
      curNode = curNode.next;
    }
    // 最後一個節點的next指向新節點
    curNode.next = newNode;
  }
}

class Node {
  public Node() {}
  public Node(int data) {
    this.data = data;
  }
  public int data;
  public Node next;
}

顯示所有節點的data

由於head頭節點的作用是永遠指向串列中第一個節點,不能移動。
所以需要有一個輔助變數curNode,來移動到每一個節點,直到找到節點的next為null。

img

輔助變數curNode一開始移動到第一個節點(head.next),螢幕顯示目前節點curNode的data,接著移動到下一個節點,直到移動到null,就離開迴圈。

移動之前,先檢查是否有第一個節點(head.next),如果沒有第一個節點就離開方法。

1
2
3
4
5
public void visitAll(int n) {
  if (head.next == null) {
    return;
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public void visitAll() {
  // 先判斷有沒有第一個節點
  if (head.next == null) {
    return;
  }
  // 輔助變數移動到第一個節點
  Node curNode = head.next;
  while (true) {
    // 如果curNode移動到null,離開迴圈
    if (curNode == null) {
      // 離開迴圈
      break;
    }
    // 螢幕顯示出目前節點的資料data
    System.out.println(curNode.data);
    // 移動到下一個節點
    curNode = curNode.next;
  }
}

完整程式碼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
public class Test1 {
  public static void main(String[] args) {
    MyLinkedList list = new MyLinkedList();
    // 新增節點
    Node node1 = new Node(1);
    list.add(node1);
    Node node2 = new Node(2);
    list.add(node2);
    Node node3 = new Node(3);
    list.add(node3);
    // 訪問所有節點,並顯示data
    list.visitAll();
  }
}
class MyLinkedList {
  Node head;
  public MyLinkedList() {
    head = new Node();
  }
  public void add(Node newNode) {
    // 輔助變數先移動到頭節點
    Node curNode = head;
    while (true) {
      // 判斷是不是最後一個節點
      if (curNode.next == null) {
        // 找到就離開迴圈,不要再移動
        // 目前的curNode就是最後一個節點
        break;
      }
      // 若不是最後一個節點,curNode輔助變數移動到下一個節點
      curNode = curNode.next;
    }
    // 最後一個節點的next指向新節點
    curNode.next = newNode;
  }
  public void visitAll() {
    // 先判斷有沒有第一個節點
    if (head.next == null) {
      return;
    }
    // 輔助變數先移動到第一個節點
    Node curNode = head.next;
    while (true) {
      // curNode移動到null
      if (curNode == null) {
        // 離開迴圈
        break;
      }
      // 螢幕顯示出目前節點的資料data
      System.out.println(curNode.data);
      // 移動到下一個節點
      curNode = curNode.next;
    }
  }
}

class Node {
  public Node() {}
  public Node(int data) {
    this.data = data;
  }
  public int data;
  public Node next;
}

results matching ""

    No results matching ""