1,單鏈表反轉

2021-06-09 18:02:23 字數 1082 閱讀 3667

題目:

顧名思義,就是反轉乙個單鏈表。

思路1:

重新開闢記憶體,簡歷乙個新鍊錶,然後從後面往前面複製。

由於單鏈表無法很容易得到當前節點前面的節點,所以,複製每乙個節點都得從前往後找到該節點,

單個節點複製的時間複雜度為o(n),整個複雜度則為o(n^2),空間複雜度為o(n)。不可取。

思路2:

不開闢新記憶體,採用交換節點內容的方式。

前後兩個指標,相互交換內容,之後前面的指標後移,後面的指標前移,再交換。

問題是後面指標前移的時間複雜度依然是o(n),所以時間復制度不變,仍為o(n^2)。不可取。

思路3,:

改變指標指向。時間複雜度為o(n),空間複雜度為o(1)。

注意:輸入可能為:

1,null

2,空鍊錶,即只含有表頭結點

3,單一結點,只有乙個有效結點

4,多個結點

前三種情況都不需要處理。

第乙個結點的反轉比較特殊,初始化這些指標即可,且將第一結點的next置null。

結束之後,所有結點處理完了。加上表頭結點即可。

注意:有表頭結點。

// linktable.cpp : 定義控制台應用程式的入口點。

//#include "stdafx.h"

#include #include using namespace std;

//鍊錶的結構體

struct node

;//1.單鏈表反轉

struct node * create( string & str_link )

return phead;

}void out_link( struct node * phead )

cout << endl;

}void reverse_link( struct node * phead )

//加上表頭節點

phead->next = prenode;

}void reverse_test()

int _tmain(int argc, _tchar* argv)

單鏈表反轉

單鏈表反轉,可以用迴圈做,當然也可以遞迴 詳見 include includestruct node 3 1 4 6 2 1 1 3 4 6 2 2 4 1 3 6 2 3 6 4 1 3 2 4 2 6 4 1 3 5 迴圈反轉,即依次改動3個指標值,直到鍊錶反轉完成 比如,上面第 1 行到第 2...

反轉單鏈表

include stdafx.h include include using namespace std struct listnode typedef listnode plistnode typedef plistnode list list creatlist return head void...

單鏈表反轉

想起很早以前某次面試,面試官很嚴肅的要求我現場手寫單鏈表反轉的 哥虎軀一震,心想 不就需要要個臨時變數來記錄位址嗎,用得著這樣煞有介事?雖然在那之前我的確沒寫過這個程式,哈哈哈 當時我草草寫了十來行 面試官不等我完成,就直接拿過去開始問問題。不知道是不是因為抗壓能力不足,在面試官的不斷 盤問 下,哥...