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

复杂链表的复制

作者头像
用户8871522
发布2022-03-31 14:22:08
3090
发布2022-03-31 14:22:08
举报
文章被收录于专栏:jzc的blog

复杂链表的复制

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

方法2思路:
1.在原节点插入副本节点
2.复制random指针(很关键的一步是copy->random=cur->random->next)指向当前指针的随机指针中的下一节点
3.分离
题解
代码语言:javascript
复制
/*
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
复制
# -*- 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 删除。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 示例
  • 思路
  • 题解
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档