题型——复杂链表的复制

输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的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;
}
};


猜你喜欢

转载自blog.csdn.net/yummy_alice/article/details/81330307
今日推荐