您好,登錄后才能下訂單哦!
本篇內容介紹了“關于鏈表的知識點有哪些”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
一 單向鏈表
1.1 單向鏈表原理圖
單向鏈表的一個鏈結點包含數據域和下一個鏈結點的指針。頭結點也包含數據域和指針域,但是一般為了方便查找,頭節點不寫數據,最后一個結點的指針指向空。
1.2 實現單向鏈表的存儲等操作
創建一個鏈結點的實體類
public class Node { // 數據域 public long data; // 指針域 public Node next; public Node(long value){ this.data = value; } }
1.2.1 插入一個節點
在頭節點后插入一個結點,第一步需要將新插入的結點指向頭結點指向的結點,第二步將頭結點指向新插入的結點。插入結點只需要改變一個引用,所以復雜度為O(1)。
public class LinkList { private Node head; /** * 在頭節點之后插入一個節點 */ public void insertFirst(long value){ Node node = new Node(value); node.next = head; head = node; } }
1.2.2 頭結點后刪除一個結點
在頭結點后刪除一個結點,就是讓頭結點指向這個結點的下一個結點。復雜度也是O(1)。
public Node deleteFirst(){ Node tmp = head; head = tmp.next; return tmp; }
1.2.3 根據數據域查找結點
查找需要比對每個結點的數據,理論上查找一個結點平均需要N/2次,所以復雜度為O(N)。
public Node find(long value){ Node current = head; while (current.data != value){ if(current.next == null){ return null; } current = current.next; } return current; }
1.2.4 根據數據與刪除結點
查找需要比對每個結點的數據,理論上刪除一個結點平均需要N/2次,所以復雜度為O(N)。
public Node delete(int value){ Node current = head; // 當前結點的前一個結點 Node pre = head; while (current.data != value){ if(current.next == null){ return null; } pre = current; current = current.next; } if(current == head){ head = head.next; }else{ pre.next = current.next; } return current; }
二 雙端鏈表
2.1 雙端鏈表原理圖
雙端鏈表是在單向鏈表的基礎上,頭結點增加了一個尾結點的引用。
2.2 實現雙端鏈表的存儲等操作
2.2.1 從頭部插入結點
如果鏈表為空,則設置尾結點就是新添加的結點。復雜度為O(1)。
public class FirstLastLinkList { private Node first; private Node last; /** * 在頭結點之后插入一個節點 */ public void insertFirst(long value){ Node node = new Node(value); if(first == null){ last = node; } node.next = first; first = node; } }
2.2.2 從尾部插入結點
如果鏈表為空,則設置頭結點為新添加的結點,否則設置尾結點的后一個結點為新添加的結點。復雜度為O(1)。
public void insertLast(long value){ Node node = new Node(value); if(first == null){ first = node; }else{ last.next = node; } last = node; }
2.2.3 從頭部進行刪除
判斷頭結點是否有下一個結點,如果沒有則設置尾結點為null,復雜度為O(1)。
public Node deleteFirst(){ Node tmp = first; if(first.next == null){ last = null; } first = tmp.next; return tmp; }
三 雙向鏈表
3.1 雙向鏈表原理圖
每個結點除了保存對后一個結點的引用外,還保存著對前一個結點的引用。
3.2 實現雙向鏈表的存儲等操作鏈結點實體類
public class Node { // 數據域 public long data; // 后一個結點指針域 public Node next; // 前一個結點指針域 public Node prev; public Node(long value){ this.data = value; } }
3.2.1 從頭部插入結點
如果鏈表為空,則設置尾結點為新添加的結點,如果不為空,還需要設置頭結點的前一個結點為新添加的結點。插入結點只需要改變兩個結點的引用,所以復雜度為O(1)。
public class DoubleLinkList { private Node first; private Node last; /** * 在頭結點之后插入一個節點 */ public void insertFirst(long value){ Node node = new Node(value); if(first == null){ last = node; } else{ first.prev = node; } node.next = first; first = node; } }
3.2.2 從尾部插入結點
如果鏈表為空,則設置頭結點為新添加的結點,否則設置尾結點的后一個結點為新添加的結點。同時設置新添加的結點的前一個結點為尾結點。插入結點只需要改變1個結點的引用,所以復雜度為O(1)。
public void insertLast(long value){ Node node = new Node(value); if(first == null){ first = node; }else{ last.next = node; node.prev = last; } last = node; }
3.2.3 從頭部刪除結點
判斷頭結點是否有下一個結點,如果沒有則設置尾結點為null,否則設置頭結點的下一個結點的prev為null。復雜度也為O(1)。
public Node deleteFirst(){ Node tmp = first; if(first.next == null){ last = null; }else{ first.next.prev = null; } first = tmp.next; return tmp; }
3.2.4 從尾部刪除結點
如果頭結點后沒有其他結點,則設置頭結點為null,否則設置尾結點的前一個結點的next為null,設置尾結點為前一個結點。復雜度為O(1)。
public Node deleteLast(){ Node tmp = last; if(first.next == null){ first = null; }else{ last.prev.next = null; } last = last.prev; return last; }
“關于鏈表的知識點有哪些”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。