鍊錶反轉是很多筆試面試常考之題,既然這麼常見那就好好研究下。其實鍊錶反轉方法很多,主要有一下幾種辦法:
1、重建新鍊錶,使用頭插法將原鍊錶元素放入,時空複雜度較大,同時如果加入「就地逆序不新建」等限制條件,該演算法便不可用;
2、堆疊法:將原鍊錶元素依序push如堆疊中,然後再pop入新鍊錶中,時空複雜度依然過大,但是思路不錯;
3、修正的頭插法: 對方法1的頭插法進行改進,不插入新建列表中,而是插入已置空的當然鍊錶中,只修改各節點的next指向,時間複雜度只有o(n)。是較為完美的解決方案。
總結:其實還存在一些變形的演算法,比如筆者剛開始開始自製了一種類似頭插法的演算法,不過需要增加乙個零時指標儲存當前指標在原煉表中的next節點,時間複雜度同演算法3是相同的,但是在參考了一些資料結構書後發現這三種演算法相對思路更加清晰更「規範」些。尤其是演算法三。
有了以上討論,寫出反轉鍊錶的演算法就很容易了,以下是演算法3的c語言實現:
#include
<
stdio.h
>
#include
<
stdlib.h
>
#define
link_length 15
typedef
struct
_node
node,
*nodeptr;
void
createlinklist(nodeptr phead)
}void
reverselinklist(nodeptr phead)
}void
printlinklist(nodeptr phead)
printf("\n
");}
intmain()
單鏈表逆序
include include typedef struct student student typedef struct list list,list list createlist void paixu list l 比較笨拙的一種方法 list reverse list l int main ...
單鏈表逆序
第二個題目是很經典的 單鏈表逆序 問題。很多公司的面試題庫中都有這道題,有的公司明確題目要求不能使用額外的節點儲存空間,有的沒有明確說明,但是如果面試者使用了額外的節點儲存空間做中轉,會得到乙個比較低的分數。如何在不使用額外儲存節點的情況下使乙個單鏈表的所有節點逆序?我們先用迭代迴圈的思想來分析這個...
單鏈表逆序
很經典的 單鏈表逆序 問題。很多公司的面試題庫中都有這道題,有的公司明確題目要求不能使用額外的節點儲存空間,有的沒有明確說明,但是如果面試者使用了額外的節點儲存空間做中轉,會得到乙個比較低的分數。如何在不使用額外儲存節點的情況下使乙個單鏈表的所有節點逆序?我們先用迭代迴圈的思想來分析這個問題,鍊錶的...