拷贝有随机指针的链表

1 题目链接

拷贝有随机指针的链表

2 题目描述

描述

现在有一个这样的链表:链表的每一个节点都附加了一个随机指针,随机指针可能指向链表中的任意一个节点或者指向空。
请对这个链表进行深拷贝。

涉及到的链表结构

// 普通链表
class RandomListNode{
    int val;
    ListNode next;
    ListNode random;
    public RandomListNode(x){
        this.val = x;
    }
}

3 代码思路

如果是普通链表,遍历一遍即可实现深度拷贝,这道题目的难点在于怎么样拷贝链表的随机指针。试想如果我们使用普通链表的拷贝方法,拷贝过来的新链表将无法得知随机指针指向的结点是哪一个。

换个思路,为了保证我们能够准确得找到新链表结点随机指针指向的位置,我们可以借助原链表知道自己随机指针指向的结点这一特点。

分为三个步骤,首先复制原来链表的结点,并插入到复制结点的后边,即复制结点。接着,通过原来链表随机指针指向结点,找到新链表结点随机指针指向的结点,即复制随机指针。最后,将原链表和新链表分离开来。实现深度拷贝。

4 代码实现

public class Solution {
    public RandomListNode copyRandomList(RandomListNode head) {
        if(head == null)
            return null;
        // 创建新结点插入到原结点后边
        RandomListNode cur = head;
        while(cur != null){
            RandomListNode temp = new RandomListNode(cur.label);
            temp.next = cur.next;
            cur.next = temp;
            cur = cur.next.next;
        }
        // 复制随机指针
        cur = head;
        while(cur != null){
            if(cur.random != null){
                cur.next.random = cur.random.next;
            }
            cur = cur.next.next;
        }
        // 把拷贝链表和原链表分离
        cur = head;
        RandomListNode newHead = cur.next;
        RandomListNode rp = newHead;
        while(cur != null){
            cur.next = rp.next;
            if(cur.next != null){
                rp.next = cur.next.next;
            }
            cur = cur.next;
            rp = rp.next;
        }
        return newHead;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要将一个链表中的数据拷贝到另一个链表里,可以按照以下步骤进行操作: 1. 首先,创建一个新的链表,作为拷贝的目标链表。 2. 遍历原链表,依次复制每个节点,并将复制的节点插入到目标链表中。这里需要注意的是,每个复制节点的值应该和原节点的值相同,并且next指针指向节点的next指针指向节点。 3. 在遍历过程中,记录每个原节点随机指针指向节点,然后根据这个记录,将目标链表中对应节点随机指针指向正确的节点。具体来说,如果原节点随机指针为空,则目标节点随机指针也为空;如果原节点随机指针不为空,则目标节点随机指针应该指向对应节点的next指针指向节点。 4. 最后,返回拷贝的目标链表。 这样,就完成了将一个链表中的数据拷贝到另一个链表里的操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [【数据结构经典面试题】链表的深度拷贝(复制带随机指针链表)](https://blog.csdn.net/K_04_10/article/details/124778753)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木水先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值