2 **實現
3 執行結果
寫個翻轉鍊錶演算法,剛開始想到乙個不錯的思路。這個思路執行效率不低,時間複雜度為o(n);可以不用分配額外的節點空間,空間複雜度為o(0)。現在把思路整理一下,並實現**,測試執行結果。
用乙個while順序遍歷這個鍊錶,然後把遍歷到每個節點插入到鍊錶頭部。
藍色箭頭即賦值符號,比如在第2個結點的操作:
while
遍歷條件可根據back不為空,即while(back)
;
struct lnodelnode, *linklist; // linklist相當於lnode*,即:struct lnode*
// 尾插法建立單鏈表l
linklist listcreat_fromtail(linklist l);
// 翻轉鍊錶l的演算法
linklist reverse_linklist(linklist l);
// 把節點node插入鍊錶l頭部
linklist insert_head(linklist l, lnode * node);
// 輸出鍊錶l元素, flag=0為鍊錶翻轉前,flag=1為鍊錶翻轉後
void print_linklist(linklist l, int flag);
int main(int argc, char *ar**)
// 翻轉鍊錶l的演算法
linklist reverse_linklist(linklist l)
//back = front = null; // for secure
return l;
}// 把節點node插入鍊錶l頭部
linklist insert_head(linklist l, lnode * node)
// 輸出鍊錶l元素, flag=0為鍊錶翻轉前,flag=1為鍊錶翻轉後
void print_linklist(linklist l, int flag)
puts("\n");
}//尾插法建立單鏈表l
linklist listcreat_fromtail(linklist l)
return l;
}
huashidazhongbeitushuguandeimac-2
:wu_being duzhe$ vim reverse_linklist.c
huashidazhongbeitushuguandeimac-2
:wu_being duzhe$ gcc reverse_linklist.c
huashidazhongbeitushuguandeimac-2
:wu_being duzhe$ ./a.out
請輸入插法建立單鏈表長度:5
請逐個輸入鍊錶元素:123
45翻轉前:
單鏈表元素個數:5, 分別是:123
45 翻轉後:
單鏈表元素個數:5, 分別是:543
21 huashidazhongbeitushuguandeimac-2
:wu_being duzhe$ ./a.out
請輸入插法建立單鏈表長度:3
請逐個輸入鍊錶元素:123
4翻轉前:
單鏈表元素個數:3, 分別是:123
翻轉後:
單鏈表元素個數:3, 分別是:321
如果你看完這篇博文,覺得對你有幫助,並且願意付贊助費,那麼我會更有動力寫下去。
經典演算法 鍊錶翻轉
比如說乙個鍊錶先是這樣,40 5 0 60 反過來就應該是 60 0 5 40 函式如下 static void reverse struct node head ref head ref prev 代表著最後乙個 傳進去的引數是煉表頭 原理就是把鍊錶都反過來指,最後乙個指向倒數第二個,方法是通過上...
初級演算法 翻轉鍊錶
反轉乙個單鏈表。示例 輸入 1 2 3 4 5 null 輸出 5 4 3 2 1 null 高階 你可以迭代或遞迴地反轉鍊錶。你能否用兩種方法解決這道題?思路1 迭代 思路很簡單 使用三個指標 迴圈使後乙個指向前乙個 再用第三個指標儲存沒有翻轉的剩餘指標的位置 自己敲得程式執行不出結果 class...
鍊錶翻轉和排序
鍊錶的翻轉 鍊錶的節點由資料域與指標域構成,針對鍊錶的翻轉採用三個指標p,q,r,p指向頭結點,q指向p的下乙個節點,r指向q的下乙個節點,p,q,r三個指標遍歷整個鍊錶,將q p next 寫成q next p 因此就將p指向q的指標反轉成q指向p。如下 include include inclu...