输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点)。
一个巧妙的解法是这样的:复制next 如原来是A->B->C 变成A->A'->B->B'->C->C',然后通过前一个的random指针定位后一个random指针,然后拆分成两个链表即可。时间复杂度和空间复杂度都是O(n)。
实现代码:
/* 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) { if(pHead==null) return null; RandomListNode curNode = pHead; while(curNode != null) { RandomListNode node = new RandomListNode(curNode.label); node.next = curNode.next; curNode.next = node; curNode = node.next; } curNode = pHead; while(curNode != null) { if(curNode.random != null) { curNode.next.random = curNode.random.next; } curNode = curNode.next.next; } curNode = pHead; RandomListNode curClonedHead = null; RandomListNode curClonedNode = null; if(curNode != null) { curClonedHead = curClonedNode = curNode.next; curNode.next = curClonedNode.next; curNode = curNode.next; } while(curNode != null) { curClonedNode.next = curNode.next; curClonedNode = curClonedNode.next; curNode.next = curClonedNode.next; curNode = curNode.next; } return curClonedHead; } }