數據結構還是很重要的,就算不是那種很牛逼的,但起碼得知道基礎的東西,這一系列就算是復習一下以前學過的數據結構和填補自己在這一塊的知識的空缺。加油。珍惜校園中自由學習的時光。按照鏈表、棧、隊列、排序、數組、樹這種順序來學習數據結構這門課程把。
-WH
一、單鏈表的概念
鏈表是最基本的數據結構,其存儲的你原理圖如下圖所示
上面展示的是一個單鏈表的存儲原理圖,簡單易懂,head為頭節點,他不存放任何的數據,只是充當一個指向鏈表中真正存放數據的第一個節點的作用,而每個節點中都有一個next引用,指向下一個節點,就這樣一節一節往下面記錄,直到最后一個節點,其中的next指向null。
鏈表有很多種,比如單鏈表,雙鏈表等等。我們就對單鏈表進行學習,其他的懂了原理其實是一樣的。
二、用java實現單鏈表
語言只是一種工具,數據結構真正體會的是那種思想,這句話確實是這樣,不管用什么寫,其思想是不改變的。以前使用的是C++,現在用的是java,一步步來實現。
2.1、編寫一個Node類來充當結點的模型。我們知道,其中有兩個屬性,1存放數據的data,2存放下一結點的引用,

2.2、單鏈表的簡單操作(增加,刪除,獲取總長度,鏈表元素排序,鏈表遍歷)
2.2.1、增加結點操作,addNode(Node)
想法: 一開始也會想如果什么結點也沒有。是不是需要判斷插入的是第一個結點的問題,但寫完后發現沒有必要,是不是第一個結點操作都是一樣的,所以通過移動的指針遍歷整個鏈表,找到最后一個結點,往后添加即可。沒難度。

2.2.2、插入結點到鏈表的指定位置。 insertNodeByIndex(int index,Node node)
注意:要知道插入操作需要的前提是什么,你才好寫代碼,寫完之后,考慮如果在特殊位置上插入,是否也一樣。還有需要進行插入位置是否可行的判斷。

2.2.3、刪除指定位置上的結點 delNodeByIndex(int index)

2.2.4、單鏈表進行選擇排序 selectSortNode()
前提要知道什么是選擇排序,如果不會,請查看我講解排序的文章
分析

2.2.5、單鏈表進行插入排序 insertSortNode()
前提:要知道什么是插入排序。這個使用插入排序寫了我好久,懵逼一樣的狀態,並且我認為我自己寫效率不是很高。不管怎樣,是騾子是馬拿出來溜溜

2.2.6、當然還可以使用冒泡排序、歸並排序,等等等,都可以自己去嘗試,我就不寫了。如果不懂這些排序,那么就看我寫排序的文章把。
2.2.7、計算單鏈表的長度

2.2.8、遍歷單鏈表,打印data

三、總結
基本的單鏈表操作就是上面這些了,自己完全手動寫一寫,會對單鏈表這種數據結構的理解有很大的幫助。當然其中比較難的是在於對鏈表的排序上,說難也不難,只要懂的幾種排序的原理,就跟寫偽代碼一樣,去實現即可。這里還有一些操作,大家可以動手做一做,我會在下一篇文章中講解這些答案。
3.1、如何從鏈表中刪除重復數據
3.2、如何找出單鏈表中的倒數第k個元素
3.3、如何實現鏈表的反轉
3.4、如何從尾到頭輸出單鏈表
3.5、如何尋找單鏈表的中間結點
3.6、如何檢測一個鏈表是否有環
3.7、如何在不知道頭結點的情況下刪除指定結點
3.8、如何判斷兩個鏈表是否相交