這次是乙個很簡單的題,但如果用遞迴做卻有些複雜,不是很好理解,但此題有助於我們對遞迴的理解。
題目:就地倒置/反轉乙個鍊錶
輸入: 1->2->3->4->5->null
輸出: 5->4->3->2->1->null
(1)常規方法struct listnode*
reverselist
(struct listnode* head)
return h->next;
}
(2)雙指標法
p是快指標,pre是慢指標
struct listnode*
reverselist
(struct listnode* head)
return pre;
}
(3)遞迴法
首先分析來一波:
終止條件當前指標指向為null時終止
返回值返回已經反轉的鍊錶
遞迴方法在函式內部,改變結點指標的指向
struct listnode*
reverselist
(struct listnode* head)
這個遞迴方法有些複雜,理解起來比較晦澀,關鍵在於理解反向。
不妨假設鍊錶為[1,2,3,4,5]
。
大體過程是先遞迴找到鍊錶的最後乙個結點。
在執行reverselist(5)的時候返回了5這個節點,此時reverselist(4)中的t就是這5個節點,注意!reverselist(4)中的head指向4,這對我們理解下一步非常重要。
在reverselist(4)接下來執行完head->next->next = head;head->next = null;
之後,5->next = 4
,4->next = null
。這時候返回了t這個節點,就是鍊錶5->4->null
。
接下來執行reverselist(3),**解析為4->next = 3
,3->next = null
,此時t是:5->4->3->null
,依次類推,在最後遞迴完成時t就是:5->4->3->2->1->null
注意最後的1應該指向null
可以檢視leetcode此題題解下的**,更容易理解此題遞迴的具體過程。傳送門
鍊錶的c語言實現(二)
單鏈表的c語言實現 1 一 單鏈表的建立 有了動態記憶體分配的基礎,要實現鍊錶就不難了。所謂鍊錶,就是用一組任意的儲存單元儲存線性表元素的一種資料結構。鍊錶又分為單鏈表 雙向鍊錶和迴圈鍊錶等。我們先講講單鏈表。所謂單鏈表,是指資料接點是單向排列的。乙個單鏈表結點,其結構型別分為兩部分 1 資料域 用...
鍊錶的C語言實現
編輯 c巨集例項 以下 摘自linux核心2.6.21.5原始碼 部分 展示了鍊錶的另一種實現思路,未採用ansi c標準,採用gnu c標準,遵從gpl版權許可。struct list head define list head init name define list head name st...
雙向鍊錶C語言實現
ifndef stdlist h define stdlist h typedef struct tagstdnode stdnode,lpstdnode typedef struct tagstdlist stdlist,lpstdlist 鍊錶資料結構 struct tagstdnode 鍊錶節...