链接:https://www.nowcoder.com/questionTerminal/f836b2c43afc4b35ad6adc41ec941dba?f=discussion
来源:牛客网
我的思路:在随机指针关系建立上,通过循环找到两个链表的对应关系。优点:运行快,缺点:内存占用大
public class Solution {
public RandomListNode Clone(RandomListNode pHead) {
if(pHead == null){
return pHead;
}
RandomListNode deepcopy = new RandomListNode(pHead.label);
RandomListNode pointerD = deepcopy;
RandomListNode pointerP = pHead;
// 第一遍先通过顺序指针将链表建立出来
while(pointerP.next != null){
RandomListNode temp = new RandomListNode(pointerP.next.label);
pointerD.next = temp;
pointerD = pointerD.next;
pointerP = pointerP.next;
}
pointerD = deepcopy;
pointerP = pHead;
// 第二遍建立随机指针关系
while(pointerP != null){
if(pointerP.random == null){
pointerP = pointerP.next;
pointerD = pointerD.next;
continue;
}
RandomListNode pointerP1 = pHead;
RandomListNode pointerD1 = deepcopy;
// 这里是通过遍历将原链表和新链表对应上,
while(pointerP1 != pointerP.random){
pointerP1 = pointerP1.next;
pointerD1 = pointerD1.next;
}
pointerD.random = pointerD1;
pointerP = pointerP.next;
pointerD = pointerD.next;
}
return deepcopy;
}
}别人的思路(参考自https://blog.nowcoder.net/n/27e887ce682b4ec798fce79ffa3097b4):
使用了map保存两个链表的对应关系,以此建立随机指针。优点:内存占用下,缺点运行速度慢点。
import java.util.HashMap;
public class Solution {
public RandomListNode Clone(RandomListNode pHead)
{
HashMap<RandomListNode, RandomListNode> map = new HashMap<RandomListNode, RandomListNode>();
RandomListNode p = pHead;
//第一次遍历 新建立节点
while(p != null){
RandomListNode newNode = new RandomListNode(p.label);
map.put(p, newNode);
p = p.next;
}
//第二次遍历 赋值映射关系
p = pHead;
while(p != null){
RandomListNode node = map.get(p);
node.next = (p.next == null)?null: map.get(p.next);
node.random = (p.random == null)?null: map.get(p.random);
p = p.next;
}
//最后的返回值
return map.get(pHead);
}
}
京公网安备 11010502036488号