一,文章簡介
二,單鏈表簡介
單鏈表(singly linked list)一種常見的資料結構,又名單向鍊錶/線性表,單鏈表是以節點的方式儲存,也就是鏈式儲存。
單鏈表的每個節點會包含data域和next域,next域是指向下個節點,
單鏈表是需要乙個頭指標來指向頭節點的,需要宣告的是頭指標和頭節點是不一樣的,頭指標是指向第乙個頭節點的,而頭節點是單鏈表中的第乙個節點。那麼回過頭來再看我們上面說的乙個節點是包括data域和next域的,如下圖所示:
使用頭指標指向頭節點,每個節點之間的鏈結,如下圖所示:
通過上面簡單的介紹幫助大家回顧下單鏈表的結構,接下來就和大家分享編寫模擬乙個單鏈表的實現。
三,初始化單鏈表
3.1 定義節點結構
我們定義乙個節點屬性包括城市編號(僅以用作標示),城市名稱。
初始化好節點後接著還需要建立乙個頭指標節點
3.2 新增節點(尾插法)
為方便我們驗證新增節點的方法,再來乙個遍歷的單鏈表的方法。單鏈表的遍歷與新增節點的第二步類似,同樣使用輔助指標移動,如果next不為空,則直接列印出來,為了圖省事就在citynode中直接重寫了tostring方法(qaq)。
接著來個main方法測試一下:
測試結果:
3.3 新增指定節點(按照編號插入)
按照順序插入節點其實就相當於在指定位置插入,大致的思路是,先獲取到要插入節點的位置,如果該節點不是最後乙個節點,那麼需要將該節點前面節點的next指向該新增節點。而新增節點的next就需要指向原節點的下個節點,以插入進單鏈表中。
第一步:同樣定義輔助指標,用來遍歷需要插入節點的位置
第二步:當獲取到要插入節點位置後,更改新增節點的next位置,如圖所示:
第三步:更改插入位置的next指標,將其指向新增的節點,如圖所示:
3.4 刪除節點
按照上述案例,通過城市編號刪除乙個指定節點。那麼按照上面的套路,毫無疑問是同樣需要乙個輔助指標的。但是刪除節點有個小小的細節,也就是我們定義的輔助指標是不能直接指向要刪除的節點,如圖:
四,小試牛刀(237)
先來分析一波題目,題中給出了鍊錶的節點資料和要指定刪除的節點。誒,等下~~~咋沒有頭節點???
好吧,其實這道題不僅要考察鍊錶的結構,還要考察腦智商~
那麼問題來了,輔助指標指向要刪除的節點,是無法直接刪除該節點。但如果我們把節點的下乙個節點將節點替換調。
按照當前思路的話,節點已經不存在了,但是多處了節點,那我們那只需要將節點刪除乙個即可。按照刪除節點的套路,可以這樣寫。
// 1,將刪除節點的下個節點複製替換 node.data = node.next.data;
// 2,將節點的指標直接指向節點 node.next = node.next.next;
五,總結
上述篇幅中,介紹了單鏈表的尾插法和指定位置插入及刪除,當親自寫一遍後其實發現並不難。當我們理解單鏈表的基礎原理後,我們再來看看關於鍊錶的題目。
本篇文章是個人的第一篇,有很多紕漏之處還請包含。後期的文章個人會更注重文章的質量,包括排版給讀者乙個更清晰的視覺。才疏學淺,有錯誤之處還請多多指教。
C 單鏈表增 刪 插 改 查(基礎版)
資料域 struct data 結點 struct node 管理結點的類 class nodemanager 這裡是我嫌棄一堆堆的 出現在main函式裡加的 void add nodemanager manager void remove nodemanager manager void inse...
每天一道資料結構 單鏈表
很久沒有寫c了,都已經忘的差不多了。下決心從今天開始每天用c練習下資料結構。現在感覺底層的東西太重要。下面是我寫的c 希望csdn的高手們能夠指點指點,演算法可以改進改進的。謝謝了!include stdio.h define type struct student define len sizeo...
每天作死一道題 單鏈表的逆轉
6 1 單鏈表逆轉 20 分 本題要求實現乙個函式,將給定的單鏈表逆轉。函式介面定義 list reverse list l 其中list結構定義如下 typedef struct node ptrtonode struct node typedef ptrtonode list 定義單鏈表型別 l...