IMWeb提升营Day5 | 训练题25:复杂链表的复制

来源:互联网 发布:世界历史书 知乎 编辑:程序博客网 时间:2024/05/17 23:47

题目描述

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

思路

/*struct RandomListNode {    int label;    struct RandomListNode *next, *random;    RandomListNode(int x) :            label(x), next(NULL), random(NULL) {    }};*//* * 思路:复制一个相同的链表很容易,难就难在特殊指针的复制 * 步骤1:先复制每个节点,并插在相应节点的后面 * 步骤2:复制节点的特殊指针 * 步骤3:把复制的节点从链表中分离出来 */class Solution {public:    RandomListNode* Clone(RandomListNode* pHead)    {        if(pHead == NULL) return NULL;        RandomListNode* curp = pHead;        RandomListNode* copynode;        RandomListNode* copylist;        int length = 0;//记录链表长度        //步骤1:复制新节点        while(curp != NULL){            copynode = new RandomListNode(curp->label);//生成一个新的复制节点            copynode->next = curp->next;//把复制节点附加在原节点后面            curp->next = copynode;            curp = copynode->next;//指向原链表的下一个节点            length++;//记录原链表的长度        }        //步骤2:处理random指针        curp = pHead;        //copynode = pHead->next;        for(int i = 0; i < length; i++){            copynode = curp->next;            if(curp->random != NULL) copynode->random = curp->random->next;//NULL没有next指针            curp = copynode->next;        }        //步骤3:分离复制节点出来        curp = pHead;        copylist = pHead->next;        for(int i = 0; i < length; i++){            copynode = curp->next;            curp->next = copynode->next;            curp = copynode->next;            if(copynode->next != NULL) copynode->next = curp->next;//NULL没有next指针        }        return copylist;    }};
原创粉丝点击