[劍指offer] --26.複雜連結串列的複製
阿新 • • 發佈:2018-11-15
題目描述
輸入一個複雜連結串列(每個節點中有節點值,以及兩個指標,一個指向下一個節點,另一個特殊指標指向任意一個節點),
返回結果為複製後複雜連結串列的head。(注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空)
解題思路
- 遍歷連結串列,複製每個結點,如複製結點A得到A1,將結點A1插到結點A後面;
- 重新遍歷連結串列,複製老結點的隨機指標給新結點,如A1.random = A.random.next;
- 拆分成兩個連結串列,奇數位置為原連結串列,偶數位置為複製連結串列,注意複製連結串列的最後一個結點
的next指標不能跟原連結串列指向同一個空結點None,next指標要重新賦值None(判定程式會認定你沒有完成複製)
public class Solution { public RandomListNode Clone(RandomListNode pHead) { if (pHead == null) { return null; } RandomListNode currentNode = pHead; //1、複製每個結點,如複製結點A得到A1,將結點A1插到結點A後面; while (currentNode != null) { RandomListNode cloneNode = new RandomListNode(currentNode.label); RandomListNode nextNode = currentNode.next; currentNode.next = cloneNode; cloneNode.next = nextNode; currentNode = nextNode; } currentNode = pHead; //2、重新遍歷連結串列,複製老結點的隨機指標給新結點 while (currentNode != null) { currentNode.next.random = currentNode.random ==null? null : currentNode.random.next; currentNode = currentNode.next.next; } //3、拆分連結串列,將連結串列拆分為原連結串列和複製後的連結串列 currentNode = pHead; RandomListNode pCloneHead = pHead.next; while (currentNode != null) { RandomListNode cloneNode = currentNode.next; currentNode.next = cloneNode.next; cloneNode.next = cloneNode.next==null?null:cloneNode.next.next; currentNode = currentNode.next; } return pCloneHead; } public class RandomListNode { int label; RandomListNode next = null; RandomListNode random = null; RandomListNode(int label) { this.label = label; } } }