單向鍊錶逆序的3種實現

2021-05-24 00:43:26 字數 1282 閱讀 9138

【遍歷實現】

node *reverse(node *list)

return r;

}其實上面的這個操作自然地對應於棧的出棧/壓棧操作.

【基於棧思想的實現】

// 1. 判斷棧是否為空

bool isempty(node* stack)

// 2. 向棧stack中壓入乙個node元素

void push(node* &stack, node* node)

// 3. 從棧stack中彈出乙個元素

node* pop(node* &stack)

node *reverse(node *oldlist)

return newlist;

}【遞迴實現】

list*    rev(    list    *    head    )  

else    if(    !head->next    )    //只有乙個結點  

else  

}遞迴時,head分別用 head head1,head2 ...headn-1, headn來表示(共n+1)個節點

rhead = rev( head->next ); 此句的遞迴一直將引數傳進來的

list * head 遞迴到 headn 然後判斷

else if( !headn->next )

將返回值給rhead,此時rhead指向鏈尾,由於在此次返回,故此次沒有執行最後的else的那部分的語句,返回上一級即是 headn-1 那一級,繼續執行

下面的 headn-1->next->next = headn-1;

headn-1->next = null; //此兩句將最後兩個逆序連線,

return rhead; //之後返回rhead比上一層的rhead即是執行

rhead = rev( head->next )賦值,因為遞迴的

口都是在這裡的,如果說好理解點也可以將rhead

來編號同理

在返回rhead後,繼續執行

headn-2->next->next = headn-2;

headn-2->next = null;

return rhead;

.....

一直到 head時 即是原鍊錶的第乙個節點,在對其head->next = null,

後,此時以 rhead 所指向的節點為鏈頭的逆序鍊錶就形成了.最好的理解就是你將遞迴時,head分別用 head head1,head2 ...headn-1, headn來編號表示就好理解的拉,對於 rhead 最好也標號。

單向鍊錶逆序問題

問題 將乙個單向單向鍊錶逆序倒轉,要求o n 的時間複雜度和o 1 的空間複雜度 該問題有兩種解法,一種非遞迴,一種是遞迴,如下 include include link.h typedef struct linknode linknode 遞迴 linknode reverselink linkn...

關於單向鍊錶的逆序

本文 http chaishushan.blog.163.com blog static 130192897200911725838630 假設鍊錶的結構為 struct node 單向鍊錶是乙個有序的序列.假設有乙個單向鍊錶a 1,2,3,4,5,現在將a表逆序後得到鍊錶b 5,4,3,2,1 常...

python3實現單向鍊錶

python3實現單向鍊錶 最近重學資料結構,無奈c語言已經忘得一乾二淨,所以乾脆用python來寫。一 結構 節點類 單向列表類 鍊錶初始化操作 init 初始化鍊錶 is empty 判斷鍊錶是否為空 get len 獲取鍊錶的長度 clear list 清除列表 增加節點 insert 在鍊錶...