單鏈表反轉

2021-06-25 14:42:55 字數 1765 閱讀 6783

實現乙個單鏈表的反轉,如:

反轉前鍊錶節點儲存資料依次為:10->9->8->7->6->5->4->3->2->1

翻轉後鍊錶節點儲存資料依次為:1->2

->3

->4

->5

->6

->7

->8

->9

->

10

要求注意**風格及時間複雜度/空間複雜度。

考察分析:

(1) 基本概念:鍊錶問題、**規範問題以及**健壯性問題

(2) 對時間複雜度的敏感度

方法1:

額外申請鍊錶,使用前插方法即可。

析:鍊錶為1->2->3->4->null,新申請乙個鍊錶,然後新鍊錶的節點資料依次對應原鍊錶的倒序節點資料,最後鍊錶為:4->3->2->1->null

缺點:額外申請記憶體,沒有考慮空間複雜度。

方法2:

先找最後乙個節點,再找倒數第二個節點,依次進行

析:

缺點:未考慮時間複雜度

方法3:

prev指向煉表頭,temp為prev->next,在迴圈體中,執行:

next = temp->next;

temp->next = prev; //讓temp的next節點指向prev

prev = temp; //prev與temp依次後移

temp = next;

迴圈的結束條件為temp的next節點指向為空。

該方法的執行時間為o(n)。

注意考慮情況:當鍊表為null或鍊錶只有乙個節點時。

程式如下:

#include #include typedef struct node

lnode,*linklist;

//插入節點資料

linklist link_insert(linklist p,int num)

temp->idata = num;

temp->next = p;

p = temp;

return p;

}//列印鍊錶

void link_print(linklist temp)

printf("\n");

}linklist link_reverse(linklist list)

linklist prev,temp,next;

prev = list;

temp = prev->next;

prev->next = null; //prev用來儲存鍊錶翻轉後的煉表頭

while (temp != null)

return prev;

}int main()

head = link_reverse(head);

printf("反轉後的結果:\n");

link_print(head);

return 0;

}

執行結果:

單鏈表反轉

單鏈表反轉,可以用迴圈做,當然也可以遞迴 詳見 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...

單鏈表反轉

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