手寫單鏈表基礎之增,刪,查!附贈一道鍊錶題

2022-01-09 21:11:16 字數 2428 閱讀 3440

​一,文章簡介

二,單鏈表簡介

單鏈表(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...