其他类型的链表和线性表的总结(一级)
生活随笔
收集整理的這篇文章主要介紹了
其他类型的链表和线性表的总结(一级)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
現在我們來看其他的鏈表單鏈表每個節點包括兩個部分,一部分包括數據,另一部分保存下一個節點的地址,根據這個指針我們就可以依次找到下一個節點這是單鏈表,但是他有一個缺點,只能通過前驅節點找到后繼節點,a1找到a2,a2找到a3是沒問題的,我想知道a3的前一個是誰,這你就得從頭開始找,看哪一個節點的下一個節點是a3,這樣才可以,這樣效率是比較低的,時間復雜度是比較高的,是O(n)級別的,效率比較低,那我們怎么辦呢,我想縮短這個時間,很多時候我們要用空間換時間,多增加空間來縮小時間,提高時間的性能,怎么辦呢雙向鏈表每個節點里面,data存儲數據的,next指向下一個節點,pre是指向前一個節點,他就組成了一個鏈表,每個節點包括三部分,不僅要指明后繼節點是誰,還要指明他的前一個節點是誰,這里面有什么好處,想找a2的后繼,根據指針知道a3,要找a2的前驅,根據存的另一個指針知道a1,多花一點空間,存儲前驅節點的地址,那我們在查詢前驅節點的時候就可以直接找到,提高了效率同樣的計算我們的單鏈表,為了操作編程的方便,我們會增加一個頭結點,在雙向鏈表里面,那么我們也會這么來處理,但是因為他是雙向的,所以我們一般增加兩個結點,一個叫頭結點,存儲數據嗎,不存儲,一個叫尾部結點,也不存儲數據,那這么一來有什么好處呢,中間所有存儲數據的節點,既不是首節點,也不是末節點,做增加刪除操作都是做中間節點來進行處理的,就可以實現算法的一致,這是我們所講的一個內容,在JAVA的LinkedList底層就是雙向鏈表的,到時我們看一下LinkedList底層的一些代碼
下面我們再來看循環鏈表什么叫循環鏈表?大家首先想一下什么叫循環鏈表,收尾相連,那這個循環是針對雙鏈表還是單鏈表呢,都可以,都是可以的單鏈表最后一個元素的指針應該是什么,應該是空,那我們現在怎么辦,我們讓最后一個節點的指針不是空,而是指向了第一個,最后一個的下一個就是第一個,收尾相連,那要是我一個元素也沒有呢,沒有a1,沒有a2,也沒有a4,循環列表是空的,如果帶頭結點,指針指向它自己雙向鏈表里面是帶頭結點的,沒有帶尾部結點,我們更仔細的來說一下,假如頭指針地址0X1012,a1的地址是0X2012,a2的地址是0X5012,后邊就不畫,an的地址是0X9999,不僅是雙向鏈表,而且還是帶循環的,這個內容大家了解就可以了我們再來看一下JAVA中的線性表1. Vetor:順序表下面我們一起來看Vector,他如果想擴容的話,一次是擴多少,我們要自己看源碼,int oldCapacity = elementData.length,原來的長度就是舊的長度,原先是16,int newCapacity = oldCapacity + ((capacityIncrement > 0) ?capacityIncrement : oldCapacity); 新的容量是舊的容量16+?,如果capacityIncrement他要是大于0,就取capacityIncrement,如果capacityIncrement他要是等于0,就取oldCapacity,就16+16j可以了他的增長是增長一倍,16可能變成32,如果是32就變成64了,也不完全是這個樣子,如果(capacityIncrement > 0)他大于0,capacityIncrement他是誰啊,protected int capacityIncrement;定義了一個變量是容量的增長,每次增長多少,public Vector(int initialCapacity, int capacityIncrement),這是Vector的一個構造方法,可以指定初始容量,還可以指定每次增長多少每次增長50個,就給他了this.capacityIncrement = capacityIncrement; 如果public Vector(int initialCapacity)我只指定了第一個參數呢那就調用this(initialCapacity, 0);初始容量就是他,每次增長0,相當于他的初始值是0,如果我的Vector什么參數也沒有呢,public Vector(),那就初始容量是10,this(10);每次增長的時候就是0,capacityIncrement他等于0了,那我恩就增長一倍,如果capacityIncrement他要是不等于0,比如10,20,50,那就每次指定固定的數就可以了,這是我們所說的Vector2. ArrayList:順序表, Vector和ArrayList的作用完全一樣,早期提供的是Vector,但是他有缺點,后來根據他的缺點我們推出了ArrayList他們的共同點他們都是順序表,底層都是長度可以動態擴展的數組,那Vector有什么優點呢,相同點底層都是長度可變的數組,不同點Vector是線程安全的,多線程操作下是線程安全的,不會出錯,但是他增加了這種線程控制的機制,導致效率低下,性能比較低,而我們知道java語言劣勢是速度要低于C語言的,因為Class文件并不是真正的機器碼,他要通過虛擬機間接的執行,C語言就直接執行機器碼就行了,早期來說他要千方百計的來提高性能,怎么辦,在ArrayList里面就去掉了線程安全的機制,這樣就換來了比較高的性能,ArrayList是線程不安全的,但是他效率比較高,那線程不安全了,我還用ArrayList嗎,我們還有一個相應的處理機制,后面也會說,我們可以手動的加同步,包括我們在最新的API里面又出現了關于并發操作的線程安全的一些類,都是有的,還有一個特點大家一定要記住,ArrayList擴容一次增加50%,你怎么知道50%了,我是自己看源碼的3. LinkedList:雙向鏈表,我們也來看一下他的相關的代碼,我們先來找一下內部類Node,我們仔細來看這個Node比較簡單吧,你看一下這個Node有幾個屬性E item;E是泛型,他底層采用了雙向鏈表,怎么雙向鏈表,存儲數據的,存儲下一個的,存儲指向前一個節點的指針,Node還是指向Node他自己,雙向鏈表是不是和他類似,然后我們再來看,這個類LinkedList里面,transient int size = 0;列表的默認長度是0,transient Node<E> first;指向第一個元素的,第一個節點的,transient Node<E> last;指向最后一個節點的,如果我們在這里面做了一個你調用public boolean add(E e),他調用了linkLast(e);linklast什么含義,從字面上理解,估計是往最后添加,last是最后,向最后添加一個節點modCount++這個是處理線程機制的,你不用管他,只要考慮上面幾行代碼就可以了這幾行就可以把一個節點加進去,加到鏈表的最后,并且還是雙鏈表的,現在大家應該具有這么一個閱讀能力了,這個任務交給大家來完成,你添加多個數據,頻繁的來調用這個代碼,最終又會生成這樣的一個結果,每個節點都是雙鏈表的,當我們創建LinkedList對象的時候,有size,first,有last,first永遠指向第一個節點,last指向最后一個節點,大家可以通過我們的測試類和我們的代碼,把這個圖畫一下,理解這個代碼,知道我們添加的思路,這就是我們講的讀源碼LinkedList類創建對象和添加元素的一個過程,單鏈表的操作我們已經很詳細的說了,這一塊大家自己來畫,畫完之后如果覺得還有不清楚的,深入理解java中的ArrayList和LinkedList:https://www.cnblogs.com/fingerboy/p/5478073.html是不是我們這兩天講的線性表,一個順序表,一個鏈表,什么是線性表,這個大家都知道,ArrayList和LinkedList一個是線性存儲結構,一個是鏈式存儲結構,ArrayList是一個長度可以動態擴展的數組,他和我們一樣,也自己寫了一個ArrayList,跟我們寫的是比較相似的,當然我們發現注釋比較少,但是別人這里又什么優點,人家這里還引入了泛型,人家這里還寫了一個內部類,內部類實現了Iterator,可以用Iterator來遍歷我們的ArrrayList,思路和我們的思路是一樣的實現LinkedList,它是一個雙鏈表的結構,我們需要提供3個類,一個是LinkedList,一個是Node節點類,還有 一個是內部類LinkedListIterator那么我們就把線性表這一塊都給解決了,簡單說一下,什么叫線性表,記住這個概念,他的存儲結構有兩種,這兩種順序表和鏈表各有什么優缺點,我們在這里都給了比較詳細的說明,線性表不管你是什么存儲結構,我從邏輯結構層面給你一個接口,你要把這些功能給我實現就可以了,然后List接口,那我們的順序表里面可以創建ArrayList來實現他,底層是一個長度可變的數組,這里面的難道是添加的時候他要動態增長,缺點是什么,添加的時候需要后移元素,效率比較低,單鏈表我們也給出了實現,為了處理的方便,我們給他增加了一個頭結點,不存儲任何的數據,這里的關鍵是如何添加數據,添加會了,下面就是如何刪除數據,添加刪除相對于比較簡單,只需要改相應的指針就行了但是你也不要忘記,你想在兩個節點之間加一個節點,必須要找到前一個節點,這個時候還得從頭開始找,這個效率還是比較低的同樣你想刪除一個節點,那也要從頭找,確定他的前驅和要刪除的節點,通過一個循環來找,找到之后可以再來刪,這是一個內容后面引入例如其他鏈表的一個概念,雙向鏈表和循環鏈表,JAVA里邊給出了相應的實現
?
總結
以上是生活随笔為你收集整理的其他类型的链表和线性表的总结(一级)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 模拟实现单链表(三级)
- 下一篇: 栈和队列(一级)