剑指offer 复杂链表的复制 bfs 遍历法

复杂链表的复制

http://www.nowcoder.com/questionTerminal/f836b2c43afc4b35ad6adc41ec941dba

思路

整个复杂链表可以看成图

步骤

  1. 先用bfs把图遍历一遍, 把每个node备份一份,存到map<Node,Node>里
  2. 遍历map, 重建整张图

代码

    public RandomListNode Clone(RandomListNode pHead) {
        if (pHead == null) return null;

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

        Queue<RandomListNode> queue = new LinkedList<>();
        queue.offer(pHead);

        // 遍历整个图(这里的链表其实已经算图了)
        while (queue.size() > 0) {
            RandomListNode out = queue.poll();
            if (!map.containsKey(out)) {
                RandomListNode new_node = new RandomListNode(out.label);
                map.put(out, new_node);

                if (!map.containsKey(out.next) && out.next != null) {
                    queue.offer(out.next);
                }

                if (!map.containsKey(out.random) && out.random != null) {
                    queue.offer(out.random);
                }
            }
        }


        // 重建图
        for (RandomListNode node : map.keySet()) {
            // 拿出对应的node
            RandomListNode corres = map.get(node);

            // 按原来的样子连接
            if (node.next != null) {
                RandomListNode next_node = map.get(node.next);
                corres.next = next_node;
            } else {
                corres.next = null;
            }

            if (node.random != null) {
                RandomListNode random_node = map.get(node.random);
                corres.random = random_node;
            } else {
                corres.random = null;
            }
        }
        return map.get(pHead);
    }

复杂度

时间:O(n)
空间:O(n)

全部评论

相关推荐

能干的三文鱼刷了10...:公司可能有弄嵌入式需要会画pcb的需求,而且pcb能快速直观看出一个人某方面的实力。看看是否有面试资格。问你问题也能ai出来,pcb这东西能作假概率不高
点赞 评论 收藏
分享
半解316:内容充实,细节需要修改一下。 1,整体压缩为一页。所有内容顶格。 2,项目描述删除,直接写个人工作量 修改完之后还需要建议,可以私聊
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务