定義
- 連結串列是一種物理儲存單元上非連續、非順序的儲存結構,資料元素的邏輯順序是通過連結串列中的指標連結次序實現的。
資料結構
public class ListNode { int val; ListNode next; ListNode() {} ListNode(int val) { this.val = val; } ListNode(int val, ListNode next) { this.val = val; this.next = next; } }
瞭解連結串列從以下常規操作入手
- 插入操作
A連結串列插入:before
A連結串列插入:after
分析(個人理解):不管插入在連結串列的頭、中間、尾,它的複雜度都是O(1),只需要改變指標的指向。找到插入前的節點,接著next(指標指向)到插入的node節點,然後插入的node節點的next指向下一個node節點。如下虛擬碼:
// 插入前 ListNode head;// node1就是head節點 ListNode node2; ListNode node3 = head.next; // 插入後 head.next = node2; // 指標head(node1)指向node2 node2.next = node3;// 指標node2指向node3
- 查詢操作
B連結串列查詢:
分析(個人理解):連結串列的查詢需要迴圈,它的複雜度是O(n)。比如查詢元素的val值,如下虛擬碼:
ListNode head; while(head != null){ int data= head.val;// 獲取node中的元素; head = head.next;// 下一個node節點 }
- 刪除操作
操作前:給大家引入dummy節點(哨兵節點),可以理解dummy節點就是一個虛擬的節點,放在連結串列的前面,指標指向頭節點。
ListNode dummy = new ListNode(-1);// 建立dummy節點 dummy.next = head; // dummy節點指標 指向頭節點 ....... return dummy.next; // dummy.next返回還是連結串列m
C連結串列刪除:
1、刪除頭節點
分析(個人理解):連結串列刪除頭節點只需要操作一次就可以,它的複雜度是O(1),如下虛擬碼:
// 刪除前 ListNode head;(頭節點我們是知道的) ListNode dummy = new ListNode(-1);// 建立dummy節點 dummy.next = head; // dummy的指向頭節點 ListNode next = head.next;// head的下一個node節點 // 刪除後 head.next = null;// 頭節點不再指向其他node節點 dummy.next = next;// dummy節點指向head節點的下一個節點,此時已完成刪除了head節點 return dummy.next;
2、刪除任意節點
分析(個人理解):刪除任意的節點,它的複雜度是O(n),如下虛擬碼:
// 假如連結串列的長度是n,刪除第 m 的node節點,m < n; ListNode head;//(頭節點我們是知道的) ListNode dummy = new ListNode(-1);// 建立dummy節點 dummy.next = head; // dummy的指向頭節點 head = dummy; // 將dummy定義頭節點 for(int i = 1; i < m; i++){ head = head.next;// 為了得到m的前節點; } ListNode nodem = head.next;// 得到第 m 的node節點 ListNode lastm = nodem.next;// 得到 m 的下一個node節點 nodem.next = null; // m 的node節點指標指向null head.next = lastm; // m 的前節點指向 m 的下一個節點 return dummy.next; // 返回連結串列
總結
1、以上是我自己對連結串列的理解,寫的可能比較囉嗦,如有不解或者錯誤希望指正。
2、陣列的結構以及插入、刪除、查詢都比較簡單我就不寫了。
2、大家也多去了解下資料結構,多去leetCode去刷題。