24、复杂链表的复制

题目描述:

  请实现函数ComplexListNode Clone(ComplexListNode head),复制一个复杂链表。在复杂链表中,每个结点除了有一个Next指针指向下一个结点外,还有一个Sibling指向链表中的任意结点或者NULL。下图是一个含有5个结点的复杂链表。图中实线箭头表示m_pNext指针,虚线箭头表示m_pSibling指针。为简单起见,指向NULL的指针没有画出。
在这里插入图片描述

解题思路:

在这里插入图片描述

Demo:

/*
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 nullptr;
        RandomListNode *currNode = pHead;
        // 复制并插入每个节点,如:复制节点A得到A1,将A1插入节点A后面
        while(currNode)
        {
            RandomListNode *node = new RandomListNode(currNode->label);
            node->next = currNode->next;
            currNode->next = node;
            currNode = node->next;
        }
        // 根据旧链表的兄弟结点初始化新链表的兄弟结点,A1->random = A->random->next;
        currNode = pHead;
        while(currNode)
        {
            RandomListNode *node = currNode->next;
            if (currNode->random)
                node->random = currNode->random->next;
            currNode = node->next;
        }
        // 将链表拆分成原链表和复制后的链表
        RandomListNode *pCloneHead = pHead->next;
        // 不能破坏原链表的结构,所以用临时变量保存
        RandomListNode *tmp = pCloneHead;
        currNode = pHead;
        while(tmp->next)
        {
            // 找到两个结点的下一个结点
            currNode->next = tmp->next;
            tmp->next = tmp->next->next;
            // 更新两个结点
            currNode = currNode->next;
            tmp = tmp->next;
        }
        currNode->next = nullptr;
        return pCloneHead;
    }
};

猜你喜欢

转载自blog.csdn.net/daaikuaichuan/article/details/85037942
今日推荐