题目:
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
思路:
1.遍历整个链表,复制每个节点,比如复制A节点得到A’,并把A’链接到A的后面
2.再次遍历链表,复制老节点的随机指针给新节点,如A’.random = A.random.next
3.拆分整链表,拆分成原链表和新链表
Java
package nowcoder;
class RandomListNode{
int label;
RandomListNode next = null;
RandomListNode random = null;
RandomListNode(int label){
this.label = label;
}
}
public class S25_Clone {
public RandomListNode Clone(RandomListNode pHead){
if (pHead == null) return null;
RandomListNode temp = pHead;
//1.遍历整个链表,复制每个节点,比如复制A节点得到A’,并把A’链接到A的后面
while (temp != null){
RandomListNode node = new RandomListNode(temp.label);
node.next = temp.next;
temp.next = node;
temp = node.next;
}
//2.再次遍历链表,复制老节点的随机指针给新节点,如A’.random = A.random.next
temp = pHead;
RandomListNode head = pHead.next;
while (temp != null){
if (temp.random != null)
temp.next.random = temp.random.next;
temp = temp.next.next;
}
//3.拆分整链表,拆分成原链表和新链表
temp = pHead;
RandomListNode temp1 = temp.next;
while (temp != null){
temp.next = temp1.next;
if (temp.next != null)
temp1.next = temp.next.next;
temp = temp.next;
temp1 = temp1.next;
}
return head;
}
}
Python
class RandomListNode:
def __init__(self, x):
self.next = None
self.random = None
self.label = x
class Clone:
def Clone(self, pHead):
if not pHead:
return None
temp = pHead
while temp:
node = RandomListNode(temp.label)
node.next = temp.next
temp.next = node
temp = node.next
temp = pHead
head = pHead.next
while temp:
if temp.next:
temp.next.random = temp.random.next
temp = temp.next.next
#拆分
temp1 = temp.next
while temp:
temp.next = temp1.next
if temp.next:
temp1.next = temp.next
temp = temp.next
temp1 = temp1.next
return head