小編給大家分享一下java中單向鏈表和雙向鏈表是什么,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
十年的牙克石網站建設經驗,針對設計、前端、開發、售后、文案、推廣等六對一服務,響應快,48小時及時工作處理。成都全網營銷的優勢是能夠根據用戶設備顯示端的尺寸不同,自動調整牙克石建站的顯示方式,使網站能夠適用不同顯示終端,在瀏覽器中調整網站的寬度,無論在任何一種瀏覽器上瀏覽網站,都能展現優雅布局與設計,從而大程度地提升瀏覽體驗。成都創新互聯公司從事“牙克石網站設計”,“牙克石網站推廣”以來,每個客戶項目都認真落實執行。
鏈表是一種物理存儲單元上非連續、非順序的存儲結構,數據元素的邏輯順序是通過鏈表中的指針鏈接次序實現的。鏈表由一系列節點組成,節點可以在運行時動態生成,節點包括兩個部分:一個是存儲數據元素的數據域,另一個是存儲下一個結點地址的指針域。
內存存儲
邏輯結構
特點描述
物理存儲上是無序且不連續的;
鏈表是由多個節點以鏈式結構組成;
邏輯層面上看形成一個有序的鏈路結構;
鏈表結構解決數組存儲需要預先知道元素個數的缺陷,可以充分利用內存空間,實現靈活的內存動態管理。
單向鏈表是鏈表的一種,其特點是鏈表的鏈接方向是單向的,鏈表的遍歷要從頭部開始順序讀取;結點構成,head指針指向第一個成為表頭結點,終止于最后一個指向NULL的指針。
添加數據
初始化head節點,作為鏈表的頭;
修改當前末尾節點的next指針;
新添加的節點房子在鏈表末尾;
刪除數據
遍歷找到要刪除的節點,把刪除節點前個節點的指針指向該刪除節點的下個節點;
雙向鏈表也叫雙鏈表,是鏈表的一種,鏈表的每個數據結點中都有兩個指針,分別指向直接后繼和直接前驅,從雙向鏈表中的任意一個結點開始,都可以很快速地訪問它的前驅結點和后繼結點,鏈表結構的使用多數都是構造雙向循環鏈表。
添加數據
遍歷找到鏈表的最后一個節點;
修改當前末尾節點的next指針;
新添加的節點房子在鏈表末尾;
添加最新尾節點的prev指針;
刪除數據
雙向鏈表,基于要刪除節點操作即可;
操作上圖中要刪除的Node2節點;
Node2.prev.next = Node2.next;
Node2.next.prev = Node2.prev;
通過上述流程的操作,就把鏈表中一個節點刪除,剩下節點再度連接成鏈式結構。
在Java的API中,LinkedList是典型的雙向鏈表結構,下面基于LinkedList源碼看雙向鏈表的操作。
基礎案例
public class M01_Linked { public static void main(String[] args) { List<User> userList = new LinkedList<>() ; User removeUser = new User(200,"Second") ; // 添加元素 userList.add(new User(100,"First")) ; userList.add(removeUser) ; userList.add(new User(300,"Third")) ; System.out.println("初始化:"+userList); // 修改元素 userList.get(0).setUserName("Zero"); System.out.println("修改后:"+userList); // 刪除元素 userList.remove(removeUser) ; System.out.println("刪除后:"+userList); } } class User { private Integer userId ; private String userName ; public User(Integer userId, String userName) { this.userId = userId; this.userName = userName; } @Override public String toString() { return "User{" + "userId=" + userId + ", userName='" + userName + '\'' + '}'; } // 省略Get和Set方法 }
節點描述
節點三個核心描述:數據,next指針,prev指針。
private static class Node<E> { E item; // 數據 Node<E> next; // 下個指針 Node<E> prev; // 上個指針 Node(Node<E> prev, E element, Node<E> next) { this.item = element; this.next = next; this.prev = prev; } }
首位節點處理
基于LinkedList源碼,首尾節點方式,針對上圖雙鏈表的首位指針特點,這里源碼很好理解。
public class LinkedList { transient Node<E> first; transient Node<E> last; // 處理首節點 private void linkFirst(E e) { final Node<E> f = first; final Node<E> newNode = new Node<>(null, e, f); first = newNode; if (f == null) last = newNode; else f.prev = newNode; } // 處理尾節點 void linkLast(E e) { final Node<E> l = last; final Node<E> newNode = new Node<>(l, e, null); last = newNode; if (l == null) first = newNode; else l.next = newNode; } }
添加節點
添加節點的方法直接調用linkLast方法,把新節點放到鏈表的尾部即可。
public boolean add(E e) { linkLast(e); return true; }
刪除節點
第一步:遍歷對比,找到要刪除的節點;
public boolean remove(Object o) { if (o == null) { for (Node<E> x = first; x != null; x = x.next) { if (x.item == null) { unlink(x); return true; } } } else { for (Node<E> x = first; x != null; x = x.next) { if (o.equals(x.item)) { unlink(x); return true; } } } return false; }
第二步:移除節點,重新搭建鏈表結構,并且把當前鏈表的數據置為null,并返回被移除的節點;
E unlink(Node<E> x) { final E element = x.item; final Node<E> next = x.next; final Node<E> prev = x.prev; if (prev == null) { first = next; } else { prev.next = next; x.prev = null; } if (next == null) { last = prev; } else { next.prev = prev; x.next = null; } x.item = null; return element; }
如上就是對Java中LinkedList雙鏈表源碼的部分結構分析,這種代碼看多了,總感覺自己寫的代碼不是Java。
在單鏈表中,將終端結點的指針域NULL改為指向表頭結點或開始結點,這樣就形成了環形鏈表:
環形鏈表鏈表的一種結構,特點是表中最后一個結點的指針域指向頭結點,整個鏈表形成一個環。
以上是“java中單向鏈表和雙向鏈表是什么”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注創新互聯行業資訊頻道!
網站欄目:java中單向鏈表和雙向鏈表是什么
URL地址:http://m.newbst.com/article2/jeseic.html
成都網站建設公司_創新互聯,為您提供小程序開發、面包屑導航、自適應網站、動態網站、網站收錄、關鍵詞優化
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯