java 面試篇-單鏈表基礎
阿新 • • 發佈:2021-01-05
java 實現單鏈表
一、資料結構的定義
- 連結串列節點的定義
public class Node { public int val; public Node next; public Node(int val, Node next) { this.val = val; this.next = next; } public Node(int val) { this(val, null); } }
- 單鏈表的定義
public class LinkList { public Node first; // 頭節點(不是真正的頭節點)
二、單鏈表的基本操作(不帶啞結點)
-
在頭部插入一個節點
addFirst
public void addFirst(int val) { this.first = new Node(val, this.first); this.size++; }
-
在 index 位置上插入節點
addAt
public void addAt(int index, int val) { // 合法的插入位置有: 0 1 2 ... size - 1, size
-
在尾部插入一個節點
addLast
public void addLast(int val) { // 呼叫 addAt() this.addAt(this.size, val); }
-
刪除 index 位置上的節點
removeAt()
public void removeAt(int index) { // 刪除時合法的 index 有: 0 1 ... size - 1 (比插入時少一個 size) if (index < 0 || index > size - 1) { System.out.println("index 不合法"); return ; } // 下文將介紹帶頭結點的刪除,不需要特殊處理 if (index == 0) { this.first = this.first.next; this.size--; return ; } Node pre = this.first; // 查詢刪除位置的前一個節點 for (int i = 0; i < index - 1; i++) { pre = pre.next; } pre.next = pre.next.next; this.size--; return ; }
-
查詢 index 位置上的節點
findAt()
public Node findAt(int index) { if (index < 0 || index > this.size - 1) { System.out.println("inde 不合法"); return null; } Node cur = this.first; for (int i = 0; i < index; i++) { cur = cur.next; } return cur; }
三、單鏈表的基本操作(帶啞結點)
- 在 index 位置上插入
addOn()
/* 插入的思路是: 1. 找到插入位置的前一個節點 pre 2. 構造一個新節點 node 3. node.next = pre.next; 4. pre.next = node; 由於 first 節點沒有前驅節點,所以構造一個前驅啞結點,使得 pre.next 對所有節點通用,也就不需要判斷 index = 0 的情況了 */ public void addOn(int index, int val) { // 省略合法性判斷 // dummy 指向第一個節點 first,dummy 為頭結點 Node dummy = new Node(-1, this.first); Node pre = dummy; // 此時不需要特殊處理 index = 0 , 注意此時是 i < index for (int i = 0; i < index; i++) { pre = pre.next; } Node node = new Node(val, pre.next); pre.next = node; this.size++; // 還原 this.first = dummy.next; }
- 刪除 index 位置上的節點
removeOn(int index)
public void removeOn(int index) { // 省略 index 合法性處理 Node dummy = new Node(-1, this.first); Node pre = dummy; // 無需特殊處理 index = 0, 注意此時是 i < index for (int i = 0; i < index; i++) { pre = pre.next; } pre.next = pre.next.next; this.size--; // 還原 this.first = dummy.next; }
參考連結:
java 連結串列的常見操作
Java基礎–單鏈表的實現