A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null.
Return a deep copy of the list.
这道问题是深层拷贝的问题。
所谓的深层拷贝和浅层拷贝在于指针引用内容的拷贝方式。
有个链表A,每个节点除了一个指向下一个节点的指针之外,还有一个随机指针,指向该链表中的任意一个节点或者不指向任何节点。
对于A的浅层拷贝就是,拷贝后的链表A‘中每个节点的随机指针是指向原来的A链表中的节点的。也就是A和A’仍然存在着联系,A‘中的随机指针的数值的改变会影响A中节点数值的改变。
深层拷贝就是,拷贝后A’中随机指针指向的是拷贝后A‘链表中的从A中拷贝的过来的节点。
举个例子:
A中节点L1.rand=L3;
A'中L1的拷贝是L1',L3的拷贝是L3'。
如果是浅层拷贝的话,L1'.random=L3
如果是深层拷贝的话,L1'.random=L3’;(注意 是L3撇)
这个就是两者的差别。
一开始想了很久仍然没想明白。
看了网上的解法几乎都是一致的。
1. 就是在A中每个节点L后插入一个该节点的拷贝节点L‘。
L'=new RandomNode(L.label)
L’.next=L.next;
这样一边过去之后,链表就扩大了一倍。
2.第二次遍历的时候,只要
L.next.random=L.random.next
就可以实现随机指针的深层拷贝了。
3.第三次遍历把A和A’分别连接到一起
L.next=L.next.next;
L'.next=L'.next.next;