其他分享
首页 > 其他分享> > JZ25复杂链表的复制

JZ25复杂链表的复制

作者:互联网

题目描述

输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)

分析:

“深拷贝”,意味着不能将该链表的每个节点的data,next,random拷贝在一个新的节点,那样新的链表的node.next指向的还是上面旧链表的一个节点【如下图】,所以进行深拷贝时不能简单的拷贝旧链表的每个节点。
在这里插入图片描述

思路:

将新旧节点的对应关系保存在Map中,分别对应key,value【如下图】

在这里插入图片描述
如图可以得到关系:
map.get(cur).next = map.get(cur.next);
map.get(cur).random = map.get(cur.random);

代码实现:

class RandomListNode {
    int label;
    RandomListNode next = null;
    RandomListNode random = null;

    RandomListNode(int label) {
        this.label = label;
    }
}

public class Test25 {
    public RandomListNode Clone(RandomListNode pHead) {

        if(pHead == null) return null;

        HashMap<RandomListNode,RandomListNode> map = new HashMap<>();
        RandomListNode cur = pHead;

        while(cur != null){
            RandomListNode node = new RandomListNode(cur.label);
            map.put(cur,node);
            cur = cur.next;
        }
        //此时  已经将新老节点的对应关系保存到map中

        cur = pHead;
        while (cur !=null){
            map.get(cur).next = map.get(cur.next);
            map.get(cur).random = map.get(cur.random);
            cur = cur.next;
        }
        //循环结束,此时新的链表的 next 和 random 已经维护完成

        return map.get(pHead);


    }
}

标签:map,cur,get,JZ25,next,链表,复制,RandomListNode,节点
来源: https://blog.csdn.net/qq_45915957/article/details/116947048