單鏈表的就地逆置是指輔助空間o(1)的逆置方法,有兩種方法:普通迴圈(頭插法重新建立帶頭節點的新鍊錶)和遞迴。下面我們詳細介紹這兩種方法:
方法一:頭插法
演算法思想:逆置鍊錶初始為空,表中節點從原煉表中依次「刪除」,再逐個插入逆置鍊錶的表頭(即「頭插」到逆置鍊錶中),使它成為逆置鍊錶的「新」的第乙個結點,如此迴圈,直至原煉表為空。
void converse(linklist *head)
}
頭插法**:
補充:對於不含頭結點的單鏈表的頭插法原地逆置
listnode* converse(listnode *head) }
return dumyofinsertedlist->next;
}
方法二:遞迴
演算法思想:先假定有乙個函式,可以將以head為頭結點的單鏈表逆序,並返回新的頭結點。利用這個函式對問題進行求解:將鍊錶分為當前表頭結點和其餘部分,遞迴的過程就是,先將表頭結點從鍊錶中拆出來,然後對其餘部分進行逆序,最後將當前的表頭結點鏈結到逆序鍊錶的尾部。遞迴的終止條件就是鍊錶只剩乙個節點時,直接返回這個節點。
/*
dfs深度遍歷這個單鏈表
在遞迴的時候,不作處理
我們就得到了逆轉的單鏈表和它的頭結點
dfs(當前狀態)
dfs(下一狀態) }*/
listnode *reverse(listnode *head)
遞迴法**:
參考:
單鏈表就地逆置
思路為定義四個工作指標p back p q back q,然後先將p q從鍊錶中摘下,在分別在p back後和q back後插入。最後在重新定位工作指標。注意點 若先全部摘下,否則在中點相遇時p和q back會重疊,使得鍊錶斷開,所以當長度為偶數時到達中點的兩個節點時要跳出迴圈,另外直接交換兩者 迴...
單鏈表就地逆置
就地逆置鍊錶 分析 我們採用頭插法或者相鄰節點直接修改指向的方法來進行逆置。如下 struct link define crt secure no warnings include include void reverse link h h next pre 頭指標指向最後乙個節點 q next n...
單鏈表的就地逆置
單鏈表的就地逆置 時限 1000ms記憶體限制 10000k 總時限 3000ms。描述讀入資料構造乙個單鏈表,實現單鏈表的就地逆置。輸入先輸入乙個小於100的正整數n,再從小到大的輸入n個正整數,建立乙個單鏈表,然後實現單鏈表的就地逆置。輸出按順序輸出逆置後的單鏈表的所有元素,每個元素佔一行。輸入...