剑指 Offer 35. 复杂链表的复制

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

在这里插入图片描述
主要思路是:以为题目的要求返回的链表和给的链表位置不一样,所以要新建结点
将新建结点和原结点放入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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值