LeetCode138. 复制带随机指针的链表

本文详细介绍了LeetCode第138题“复制带随机指针的链表”的两种解决方案:一种通过拆分节点的方法;另一种利用哈希映射进行节点复制。这两种方法都有效地解决了题目中的难点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LeetCode138. 复制带随机指针的链表

1. 问题描述

在这里插入图片描述
在这里插入图片描述

2. 思路

2.1. 思路一

  1. 将该链表中每一个节点拆分为两个相连的节点,例如对于链表 A→B→C,我们可以将其拆分为 A→A ′ →B→B ′ →C→C ′
  2. 我们可以直接找到每一个拷贝节点 S ′ 的随机指针应当指向的节点,即为其原节点 SS 的随机指针指向的节点 T的后继节点 T ′
  3. 将重装好的链表进行拆分

2.2. 思路二

  1. 声明一个map[*Node]*Node类型的map
  2. 遍历链表,以node为key,当前node的值为Value重构一个node
  3. 再次遍历链表,将map中的value,重新构造

3. 代码

3.1. 思路一代码

/**
 * Definition for a Node.
 * type Node struct {
 *     Val int
 *     Next *Node
 *     Random *Node
 * }
 */

func copyRandomList(head *Node) *Node {
    if head == nil {
        return nil
    }

    for cur := head; cur != nil; cur = cur.Next.Next {
        cur.Next = &Node {
            Val : cur.Val,
            Next : cur.Next,
        }
    }

    for cur := head; cur != nil; cur = cur.Next.Next {
        if cur.Random != nil {
            cur.Next.Random = cur.Random.Next 
        }
    }

    head1 := head.Next
    for cur := head; cur != nil; cur = cur.Next {
        cur1 := cur.Next
        // cur和cur1将一个链表拆分成两个链表
        cur.Next = cur.Next.Next
        if cur1.Next != nil {
            cur1.Next = cur1.Next.Next
        }
    }
    return head1
}

3.2. 思路二代码

func copyRandomList(head *Node) *Node {
    if head == nil {
        return nil
    }

    cur := head
    nodes := map[*Node]*Node{}
    for cur != nil {
        nodes[cur] = &Node{
            Val:cur.Val,
        }
        cur = cur.Next
    }

    cur = head
    for cur != nil {
        nodes[cur].Next = nodes[cur.Next]
        nodes[cur].Random = nodes[cur.Random]
        cur = cur.Next
    }
    return nodes[head]
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值