C語言實現鍊錶中的遞迴 二

2021-10-03 19:45:28 字數 1370 閱讀 8494

這次是乙個很簡單的題,但如果用遞迴做卻有些複雜,不是很好理解,但此題有助於我們對遞迴的理解。

題目:就地倒置/反轉乙個鍊錶

輸入: 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 鍊錶節...