劍指offer刷題記錄25——複雜連結串列的複製
阿新 • • 發佈:2018-12-25
題目描述:
輸入一個複雜連結串列(每個節點中有節點值,以及兩個指標,一個指向下一個節點,另一個特殊指標指向任意一個節點),返回結果為複製後複雜連結串列的head
因為是一個複雜連結串列,每個節點有一個random屬性,導致無法採用簡單的一個一個節點進行復制的方法。
故而將整個解法分成三步,如下所示:
解法:
/* public class RandomListNode { int label; RandomListNode next = null; RandomListNode random = null; RandomListNode(int label) { this.label = label; } } */ public class Solution { public RandomListNode Clone(RandomListNode pHead) { RandomListNode pCurrent = pHead; //1.將每個節點複製並放在原節點之後 while(pCurrent != null) { RandomListNode temp = new RandomListNode(pCurrent.label); temp.next = pCurrent.next; pCurrent.next = temp; pCurrent = temp.next; } //2.將每個新節點的random設定為原節點的random的next pCurrent = pHead; while(pCurrent != null) { if(pCurrent.random != null) { pCurrent.next.random = pCurrent.random.next; } pCurrent = pCurrent.next.next; } //3.將新舊連結串列分開,並返回新連結串列 RandomListNode pOrigin = pHead; pCurrent = pHead.next; RandomListNode pResult = pHead.next; while(pCurrent.next != null) { pOrigin.next = pCurrent.next; pOrigin = pOrigin.next; pCurrent.next = pOrigin == null ? null : pOrigin.next; pCurrent = pCurrent.next; } return pResult; } }