复杂链表的复制

class Solution {
public:
//此题分为 3 个步骤来对链表进行操作
RandomListNode* Clone(RandomListNode* pHead)
{
if(!pHead)
return nullptr;

    createNode(pHead);
    connectRamdomPoint(pHead);
    RandomListNode*p = cutOldList(pHead);

    return p;
}

private:
//增加新结点,并将其附在旧的结点的后面
void createNode(RandomListNode *pHead)
{
if(!pHead)
return;
RandomListNode * p = pHead;
while(p)
{
RandomListNode * newNode = new RandomListNode(p->label);
newNode->next = p->next;
p->next = newNode;
p = p->next->next;
}
}
//连接random指针
void connectRamdomPoint(RandomListNode *pHead)
{
if(!pHead)
return;

    RandomListNode*p = pHead;
    RandomListNode* pNext = p->next;
    while(p)
    {
        if(p->random)
        pNext->random = p->random->next;
        else
            pNext->random = nullptr;

        p = pNext->next;
        if(p)
            pNext = p->next;
        else
            break;
    }
}
//断开旧链表结点
RandomListNode * cutOldList(RandomListNode *pHead)
{
    if(!pHead)
        return nullptr;

    RandomListNode*p = pHead;
    RandomListNode* pNext = p->next;
    RandomListNode* res = pNext;  //结果的头节点
    while(pNext)
    {
        p->next = pNext->next;
        p = p->next;
        if(p){
            pNext->next = p->next;
            pNext = pNext->next;
        }
        else{
            pNext->next = p;
            pNext = pNext->next;
        }
    }
    return res;
}

};

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-16 12:23
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-17 14:06
点赞 评论 收藏
分享
头顶尖尖的程序员:我也是面了三四次才放平心态的。准备好自我介绍,不一定要背熟,可以记事本写下来读。全程控制语速,所有问题都先思考几秒,不要急着答,不要打断面试官说话。
点赞 评论 收藏
分享
07-18 18:09
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务