單鏈表的翻轉是一道很基本的演算法題。
方法1:將單鏈表儲存為陣列,然後按照陣列的索引逆序進行反轉。
方法2:使用三個指標遍歷單鏈表,逐個鏈結點進行反轉。
方法3:從第2個節點到第n個節點,依次逐節點插入到第1個節點(head節點)之後,最後將第乙個節點挪到新錶的表尾。
方法1的問題是浪費空間。方法2和方法3效率相當。一般方法2較為常用。
方法2**:
[cpp]view plain
copy
node * reverselist(node *head)
head->next=null; //原先的head已經變成tail,別忘了置空,只有到這步才能置空
*head=p1;
return
head;
}
方法3**:
[cpp]view plain
copy
node* reverselist(node* head)
p->next=head; //相當於成環
head=p->next->next; //新head變為原head的next
p->next->next=null; //斷掉環
return
head;
}
附加一道題目,《程式設計之美》的3.4:從無頭鍊錶中刪除節點。假設有乙個沒有頭指標的單鏈表。乙個指標指向此鍊錶中間的乙個節點(不是第乙個,也不是最後乙個節點),請將該節點從單鏈表中刪除。
分析:無法知道前續的節點,只能知曉後續節點,所以存在乙個難點,如何將前後兩段連線起來。由於鍊錶是要刪除操作,所以多處乙個可用空間。所以可以用翻轉操作方法1的思想來解決。將需要刪除節點的節點複製為其後續節點就可以了,這樣後續節點已經不再鍊錶中,可以進行析構。
單鏈表反轉
單鏈表反轉,可以用迴圈做,當然也可以遞迴 詳見 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...
單鏈表反轉
想起很早以前某次面試,面試官很嚴肅的要求我現場手寫單鏈表反轉的 哥虎軀一震,心想 不就需要要個臨時變數來記錄位址嗎,用得著這樣煞有介事?雖然在那之前我的確沒寫過這個程式,哈哈哈 當時我草草寫了十來行 面試官不等我完成,就直接拿過去開始問問題。不知道是不是因為抗壓能力不足,在面試官的不斷 盤問 下,哥...