博客
关于我
LeetCode: 138. 复制带随机指针的链表(中等)[DFS, 迭代]
阅读量:600 次
发布时间:2019-03-12

本文共 1978 字,大约阅读时间需要 6 分钟。

为了实现这个问题,我们需要构造一个链表的深拷贝,包括每个节点的值、next指针和random指针。深拷贝必须由新的节点组成,每个节点的值与原节点一致,并且指针也应指向复制链表中的节点。

方法思路

为了解决这个问题,我们使用分阶段迭代的方法来构造深拷贝。具体步骤如下:

  • 创建拷贝头节点:从原链表头节点开始创建复制链表的头节点,并将其存储在字典中,以便后续处理。
  • 遍历链表拷贝节点的值和next指针:首先将链表中的每个节点值拷贝到新链表中,并处理每个节点的next指针。确保所有节点和指针都已被拷贝并存储到字典中。
  • 处理随机指针(random pointer):再次遍历原链表的每个节点,更新它们的random指针,使其指向复制链表中的相应节点。这样可以确保每个random指针都指向合成链表中的正确节点。
  • 这种方法的时间复杂度为O(n),因为只遍历了链表两次。空间复杂度为O(n),由于我们需要存储旧节点到新节点的映射。

    解决代码

    class Solution {    public Node copyRandomList(Node head) {        if (head == null) return null;        // 使用字典记录旧节点到新节点的映射        Map
    map = new HashMap<>(); // 处理头节点 Node newHead = new Node(head.val); map.put(head, newHead); // 迭代处理链表中的每个节点(处理next指针) Node current = newHead; while (head != null) { // 处理当前节点的下一个节点 Node nextHead = head.next; Node newNode = new Node(head.val); map.put(head, newNode); if (current.next != null) { // 设置复制节点的下一个节点 newNode.next = current.next; // 需要保持原节点和新节点的next指针对应 // current的下一个节点可能已经处理过了 current.next = newNode; } else { // 处理null的情况 current.next = newNode; } current = newNode; head = nextHead != null ? nextHead : null; } // 处理每个节点的random指针 current = newHead; while (current != null) { Node randomTarget = current.random; // 获取当前节点的random指针目标节点 // 解决random可能为null的情况 if (randomTarget != null) { // 需要将其映射到复制链表中的对应节点 current.random = map.get(randomTarget); // map已经有了所有oldNode <-> newNode的映射 } // 处理下一个节点 current = current.next; } return newHead; }}

    代码解释

  • 初始化处理头节点:创建复制链表的头节点,并将其存储在字典中。
  • 遍历链表:处理每个节点的值,并构建下一个指针。确保所有节点的next指针都被正确拷贝。
  • 更新随机指针:遍历原链表中的每个节点,并将其random指针指向复制链表中的相应节点,确保不存指向原链表节点的情况。
  • 这种方法通过分阶段处理,确保每个节点及其指针都被正确拷贝,从而完成深拷贝任务。

    转载地址:http://fcwaz.baihongyu.com/

    你可能感兴趣的文章
    C++long long
    查看>>
    腾讯十年开发者发自腾讯一线的真实Android面试资料
    查看>>
    至迷茫的移动互联网工作者:看数据和趋势
    查看>>
    程序员应聘经验的重要性
    查看>>
    移动开发程序员的悲哀是什么?
    查看>>
    全网独家盘点Android热修复方案(含阿里巴巴、美团、腾讯等)
    查看>>
    一线互联网企业老Android开发谈:Retrofit的源码你真的看懂这些了吗?
    查看>>
    简述Android中gradle的简单知识
    查看>>
    Android 架构组件 – 让天下没有难做的 App
    查看>>
    Android多种方式实现相机圆形预览 看这一篇就够了
    查看>>