
主要思路是:以为题目的要求返回的链表和给的链表位置不一样,所以要新建结点
将新建结点和原结点放入Map中,key为原结点,value为新建结点
然后通过在map中取出原结点,得到新节点,让新节点next指向 map中原结点的next对应新节点
连接random也同理
public class Offer35 {
/** 题目的要求返回的链表和给的链表位置不一样,所以要新建结点*/
public Node copyRandomList(Node head) {
if (head == null) return null;
/** 将新建结点和原结点放入Map中,key为原结点,value为新建结点,同时将新建接结点根据原结点的value复制*/
HashMap<Node, Node> map = new HashMap<Node, Node>();
Node temp = head;
while (temp != null){
map.put(temp,new Node(temp.val));
temp = temp.next;
}
/** 取出map中的结点 根据map中的key开始连接*/
Node curr = head;
while (curr != null){
map.get(curr).next = map.get(curr.next);//得到对应结点 使next指向下一个原结点对应的新节点
map.get(curr).random = map.get(curr.random);//得到对应结点,使random指向random位置上的结点
curr = curr.next;
}
return map.get(head);
}
}
class Node {
int val;
Node next;
Node random;
public Node(int val) {
this.val = val;
this.next = null;
this.random = null;
}
}

该博客探讨了一种复杂链表结构的复制问题,其中每个节点不仅包含next指针,还有random指针。解决方案是通过创建新节点并映射原节点,然后遍历映射表来连接新节点的next和random属性,从而实现链表的深拷贝。
498

被折叠的 条评论
为什么被折叠?



