如圖1所示,有一條單鏈表,其節點除了有next指標外,還有乙個random指標。random指標可指向單鏈表中的任意節點,包括它自身。random指標一旦指定,便不再更改。請設計演算法,複製此單鏈表,並給出時間複雜度。
圖1 帶有random指標的單鏈表
先按next指標,將鍊錶複製乙份。使用p1指向原鍊錶的頭節點,p2指向p1指向的節點的random節點,p3指向p1的next節點,cnt記錄p3移動的步數,p4指向新鍊錶的頭節點。對比p3和p2的指向:如果p2和p3位址不一致,則p3移向本節點的next節點,並記錄移動的頻數加1。如此反覆,直到p3指向的位址與p2指向的位址一致。使用p5指向p4的next節點,再向後移動cnt次,得到p4指向的節點的random指標應該指向的位置。將p1和p4同時移向各自的next。如此反覆。
想要降低時間複雜度,就需要增加空間複雜度,拿空間換時間。解法1的時間複雜度高的原因為查詢新煉表中random指標的指向,雜湊錶可解決查詢慢的問題。
可建立乙個hash表,使用原鍊錶的節點的位址的hash值作下標,使用新鍊錶對應的位址作value。這樣遍歷原鍊錶一遍後,節點的random指向為null的新鍊錶可建立起來,並且建立了一張hash表。再遍歷一遍,p1指向原煉表中某節點,p2指向新煉表中對應的某節點。將p1的random指標指向的位址做hash後,可得到hash表中新鍊錶對應的位址值。再將p2的random指標指向該位址即可。如此反覆。
解法2所花費的空間有些大了,解決法通破壞原鍊錶的方法,代替了hash表,解決了查詢random指標指向的問題。雖然原鍊錶被破壞了,但可被恢復到原樣。
首先遍歷原鍊錶,同時建立新鍊錶。將新鍊錶的random指標指向原鍊錶對應節點的next節點,將原鍊錶的next指標指向新鍊錶的對應節點。
再遍歷一次原煉表和新鍊錶,p1指向原鍊錶的某節點,p2指向新鍊錶的對應節點。從p1可知random指向的節點,從此節點的next指標可知新鍊錶的對應節點,使用p3指標指向該節點。將p1的next指向p2的random指標指向的節點,再將p2的random指標指向p3。p1和p2均指向自己的next節點。如此反覆。
解法3的示意圖如下:
複製帶有random指標的單鏈表
如圖1所示,有一條單鏈表,其節點除了有next指標外,還有乙個random指標。random指標可指向單鏈表中的任意節點,包括它自身。random指標一旦指定,便不再更改。請設計演算法,複製此單鏈表,並給出時間複雜度。圖1 帶有random指標的單鏈表 解法1.時間複雜度為o n n 先按next指...
帶有隨機指標鍊錶的複製
上次介紹了關於鍊錶的相交與求環問題,這次我來給大家介紹乙個讓我腦瓜子嗡嗡的複雜鍊錶的複製問題。說實話,鍊錶也太狂野了,太會玩了,都快趕上蘇大強了。我的個天,畫了半天,別介意,本人畫畫水平不是特別高,大家湊合看。如上圖所示,每個節點包含乙個額外增加的隨機指標,該指標可以指向鍊錶中的任何節點或空節點。現...
帶有const修飾的指標解讀
通過例項來看看const所修飾的指標使用方法 1 先看乙個普通的指標使用。形式 int ptmp 含義 乙個普通的指向int型別的指標 cpp view plain copy print?intmain intargc,char argv 輸出 plain view plain copy print...