前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >复杂链表的复制

复杂链表的复制

作者头像
用户8871522
发布于 2022-03-31 06:22:08
发布于 2022-03-31 06:22:08
31600
代码可运行
举报
文章被收录于专栏:jzc的blogjzc的blog
运行总次数:0
代码可运行

复杂链表的复制

示例
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入:
{1,2,3,4,5,3,5,#,2,#}
返回值:
{1,2,3,4,5,3,5,#,2,#}
思路
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
方法1:创建新节点直接存
方法2:原节点上操作再分离(1->1'->2->2')

方法2思路:
1.在原节点插入副本节点
2.复制random指针(很关键的一步是copy->random=cur->random->next)指向当前指针的随机指针中的下一节点
3.分离
题解
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*
struct RandomListNode {
    int label;
    struct RandomListNode *next, *random;
    RandomListNode(int x) :
            label(x), next(NULL), random(NULL) {
    }
};
*/
class Solution {
public:
    RandomListNode* Clone(RandomListNode* pHead) {
        if (!pHead) {
            return NULL;
        }
        //1.创建原节点副本,放到原节点后
        RandomListNode *cur = pHead;
        while (cur) {
            RandomListNode *cpyNode = new RandomListNode(-1);
            //创建新节点
            cpyNode->label = cur->label;//传递label
            cpyNode->next = cur->next;//传递next指针
            //插入新节点
            cur->next = cpyNode;//插入节点
            cur = cpyNode->next;//指针指向下一节点
        }
        //2.构造随机指针
        RandomListNode *tmp = pHead;//指到头部
        RandomListNode *tmp2;
        while (tmp) {
            tmp2 = tmp->next;
            if (tmp->random) {
                tmp2->random = tmp->random->next;//很关键,注意是指向random->next
            }
            tmp = tmp2->next;
        }
        //3.分成两个链表
        RandomListNode *p1 = pHead;//1
        RandomListNode *p2;
        RandomListNode *clone = pHead->next;//2
        while (p1) {
            p2 = p1->next;
            p1->next = p2->next;
            p1 = p1->next;
            if (p1) {//判断是否有下一节点
                p2->next = p1->next;
            }
        }
        return clone;
    }
};
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# -*- coding:utf-8 -*-
# class RandomListNode:
#     def __init__(self, x):
#         self.label = x
#         self.next = None
#         self.random = None
class Solution:
    # 返回 RandomListNode
    def Clone(self, pHead):
        # write code here
        if not pHead:
            return None
        cur = pHead
        while cur:#1.复制val和next
            cpyNode = RandomListNode(-1)
            cpyNode.label = cur.label
            cpyNode.next = cur.next
            cur.next = cpyNode
            cur = cpyNode.next
        cur = pHead
        while cur:#复制random
            if cur.random:
                cur.next.random = cur.random.next
            cur = cur.next.next
        cur = pHead
        clone = pHead.next
        while cur.next://拆分
            tmp = cur.next
            cur.next = tmp.next
            cur = tmp
        return clone
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-12-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
复杂链表的复制
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的 head。
MickyInvQ
2021/12/07
4740
复杂链表的复制
【剑指Offer】35. 复杂链表的复制
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的 head。 请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
瑞新
2020/12/07
2680
【剑指Offer】35. 复杂链表的复制
「复制带随机指针的链表」的一个很巧妙解法
题目来源于 LeetCode 上第 138 号问题:复制带随机指针的链表。题目难度为 Medium,目前通过率为 40.5% 。
五分钟学算法
2019/05/06
5670
「复制带随机指针的链表」的一个很巧妙解法
剑指offer——复杂链表的复制
题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
AI那点小事
2020/04/20
2450
算法:双指针
双指针是一种思想或一种技巧并不是特别具体的算法。具体就是用两个变量动态存储两个结点,来方便我们进行一些操作。通常用在线性的数据结构中。
用户3578099
2022/04/18
3610
算法:双指针
LeetCode 复制带随机指针的链表(C语言)
给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。
有礼貌的灰绅士
2023/03/28
7640
LeetCode 复制带随机指针的链表(C语言)
每日算法题:Day 13
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
算法工程师之路
2019/08/15
3550
每日算法题:Day 13
剑指Offer(二十五)-- 复杂链表的复制
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
秦怀杂货店
2022/02/15
1550
剑指offer--合并两个排序的链表
题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
AI那点小事
2020/04/20
2660
C++刷题(一):顺序表 + 单链表
这道题的关键在于,如何讲nums2的数组元素插入nums1,因为nums1的长度为m+n,也就代表后面有空位,所以可以选择从后往前插入。
用户11029137
2025/03/15
430
C++刷题(一):顺序表 + 单链表
链表常见面试题
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
河马嘴不大
2022/12/24
1760
LeetCode 138:复制带随机指针的链表 Copy List with Random Pointer
给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。
爱写bug
2019/07/29
3900
【Leetcode】单链表常见题
首先,这道题需要删除元素,我可以初始化一个结构体指针cur进行遍历链表,对于每个节点,检查它的值是否等于val,如果cur指向的节点值等于val,则需要删除这个节点,这里一个结构体指针是不够的,是因为单链表的单向性,我们则需要再定义另一个指针prev来实现
用户11029103
2024/04/02
1060
【Leetcode】单链表常见题
剑指offer【30~39】
除了存储数据的栈 stack,再定义一个最小栈 minstack。minstack 的长度和 stack 保持同步,只不过其是一个递减栈。如 stack = [6,7,4,5,3,8],则 minstack = [6,6,4,4,3,3]。这样,在 pop 的时候,同时 pop 两个栈,不会因为删除最小值而在 minstack 中找不到。
echobingo
2019/12/20
3870
牛客网 复杂链表的复制
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
2018/09/04
7380
牛客网 复杂链表的复制
链表算法面试问题?看我就够了!
单链表的操作算法是笔试面试中较为常见的题目。本文将着重介绍平时面试中常见的关于链表的应用题目。
五分钟学算法
2019/03/14
1.1K0
链表算法面试问题?看我就够了!
【初阶数据结构篇】链表算法的进阶修炼:破解复杂链表问题的奥秘
按照上⾯的分析,慢指针每次⾛⼀步,快指针每次⾛三步,此时快慢指针的最⼤距离为N,接下来的 追逐过程中,每追击⼀次,他们之间的距离缩⼩2步 追击过程中fast和slow之间的距离变化:
半截诗
2024/10/09
1560
【初阶数据结构篇】链表算法的进阶修炼:破解复杂链表问题的奥秘
剑指Offer题解 - Day3
请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。
chuckQu
2022/08/19
1420
【Leetcode】链表的深度拷贝——复制带随机指针的链表
做完了一些较为基础的题目后,会不会发现链表题目其实只要把图给画好了,逻辑理清晰,一切就会迎刃而解。如果有这种感觉的话,不妨来挑战一下下面这道来源于力扣上的一道题目:https://leetcode.cn/problems/copy-list-with-random-pointer(点击传送) 如下:
诺诺的包包
2023/02/20
4220
链表问题
A stringSof lowercase letters is given. We want to partition this string into as many parts as possible so that each letter appears in at most one part, and return a list of integers representing the size of these parts.
大学里的混子
2019/03/01
4810
相关推荐
复杂链表的复制
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文