C語言鍊錶翻轉的三種實現方式(棧 頭插法 遞迴法)

2021-10-23 00:15:40 字數 1849 閱讀 1371

題目:反轉乙個單鏈表。

示例:

輸入:1->2->3->4->5->null

輸出:5->4->3->2->1->null

背景:這道題乍一看還是非常簡單的,我兩個月前做這個題的時候,用的是棧後進先出的特性。今天覆習這個題的時候使用的是頭插法,因為頭插法精準而優雅,**還簡單。但這道題給我的幾個啟示:

①用自己最擅長的方法解題,在真實的戰鬥(考試)中花裡胡哨的操作消耗腦力。

②解題要向最基本的演算法靠攏,多積累書上的基本方法。

③注意訓練微操,人人都知道頭插法,可一些細節拖慢速度,難以一氣呵成。

和玩王者榮耀一樣,要上分就用擅長的英雄,熟練掌握英雄基本操作,注意操作細節。也應該多玩幾個英雄,不要像我一樣只會玩公孫離。

大概思路:根據棧的後進先出原理,讓鍊錶結點先進棧後出棧,就能得到逆序組合。

①在第乙個while中,計算棧所需要的空間size。

②在第二個while中,將原煉表中的結點位址進棧,注意是結點位址。

③在第三個while中,出棧並按照出棧順序鏈結起來,形成新的鍊錶。

/**

* definition for singly-linked list.

* struct listnode ;

*/struct listnode* reverselist(struct listnode* head)

int size=0;struct listnode* p=head;

while(p!=null)

struct listnode*stack[size];

int top=-1;p=head;

while(p!=null)

struct listnode* head2=stack[top];

p=head2;

while(top!=-1)

p->next=null;

return head2;

}

宣告乙個新鍊錶output,這個鍊錶含有頭結點。依次遍歷原鍊錶的元素,總是將遍歷的結點作為第乙個結點插入新鍊錶,頭插法顧名思義。

while中的微操

①temp=output->next; 暫存鍊錶中第乙個元素,以後新來的第乙個元素的next會指向它;

②q=p->next;原鍊錶的第乙個結點要被放入新鍊錶,所以用q指向第二個結點,以後它就是下一次迴圈的第乙個結點。

③output->next=p;新鍊錶的頭結點的next指向新來的結點,也就是「頭插」。

④p->next=temp;跟temp=output->next; 呼應,頭結點-> 新來的第乙個結點->原來的第乙個結點組合在了一起。

⑤p=q;開始下一次迴圈時,p就變成頭結點了,與q=p->next;呼應。

struct listnode* reverselist(struct listnode* head)

return output->next;

}

一圖勝千言,**中的變數名與圖中的變數名結合,可以理解作者的意思。

struct listnode*output2;//全域性變數

void reverse(struct listnode*head,struct listnode*pre)else

}struct listnode* reverselist(struct listnode* head)

鍊錶的三種實現

原題 頻繁的插入和刪除就用鍊錶,陣列可以實現隨機訪問,鍊錶不能 題解 方法一 陣列解法 includeusing namespace std int n,a,b,k,v 100000 struct studentd 100000 int main else cin n for int i 1 i n...

三種方式實現 從尾到頭輸出鍊錶

三種方式實現 從尾到頭輸出鍊錶 方法一 借用棧倒序輸出鍊錶 方法二 先翻轉鍊錶,再順序輸出 方法三 遞迴實現,乙個妙,兩個字妙啊 方法一 借用棧倒序輸出鍊錶 因為棧是先進後出,把鍊錶中的元素存進棧中,鍊錶前面的元素在棧底,後面的元素在棧頂,鍊錶後面的元素先出棧 方法二 先翻轉鍊錶,再按順序列印 主要...

三種方式實現 從尾到頭輸出鍊錶

三種方式實現 從尾到頭輸出鍊錶 方法一 借用棧倒序輸出鍊錶 方法二 先翻轉鍊錶,再順序輸出 方法三 遞迴實現,乙個妙,兩個字妙啊 方法一 借用棧倒序輸出鍊錶 因為棧是先進後出,把鍊錶中的元素存進棧中,鍊錶前面的元素在棧底,後面的元素在棧頂,鍊錶後面的元素先出棧 方法二 先翻轉鍊錶,再按順序列印 主要...