题型——复杂链表的复制

本文介绍了一种复杂链表的复制方法,通过三个步骤完成复制:首先将每个新节点插入原节点之后;接着设置新节点的random指针;最后拆分链表得到复制后的链表。

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

输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空

这里写图片描述
此题是一个复杂链表的复制,我们的思路分为三部分。

1、根据原始链表的每个结点N创建对应的N’,再把N’放到N的后面。

2、设置复制出来的结点的random结点,假设原始链表上的N的random指向结点S,那么其对应复制出来的N’是N的next指向的结点,同样S’也是S的next指向的结点

3、把这个长链表拆分成两个链表,偶数位置的结点链接起来就是复制出来的链表。

下面来实现以下代码

/*
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 == NULL)
    {
        return NULL;
    }
    //第一步:根据原始结点N创建新结点N',N'链接到N后面
    //A-B-C-D-E
    //A-A'-B-B'-C-C'-D-D'-E-E'
    andomListNode* node = pHead;
    while(node != NULL)
    {
        RandomListNode* cloneNode = new RandomListNode(0);
        cloneNode->label = node->label;
        cloneNode->next = node->next;
        node->next = cloneNode;
        node = cloneNode->next;
    }

    //第二步:设置复制出来的random
    RandomListNode* node1 = pHead;
    while(node1 != NULL)
    {
            RandomListNode* cloneNode1 = node1->next;
            if(node1->random != NULL)
            {
                cloneNode1->random = node1->random->next;
            }
            node1 = cloneNode1->next;
    }
    //第三部:把长链表拆开成两个链表,偶数位置的为复制链表
    RandomListNode* nodeEven = NULL;
    RandomListNode* nodeEvenHead = NULL;
    RandomListNode* node2 = pHead;
    if(node2 != NULL)
    {
        nodeEven = nodeEvenHead = node2->next;
        node2->next = nodeEven->next;
        node2 = node2->next;
    }
    while(node2 != NULL)
    {
        nodeEven->next = node2->next;
        nodeEven = nodeEven->next;
        node2->next = nodeEven->next;
        node2 = node2->next;
    }
    return nodeEvenHead;
}
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值