剑指offer 面试题35 复杂链表的复制

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

输入:复杂链表的头结点

输出:复制后复杂链表的head

思路:

方法一:分两步(时间复杂度O(n),空间复杂度O(n))

第一步,复制原始链表上的每个节点N创建N‘,用pNext连接起来,把配对信息放于哈希表中;

第二步,设置复制链表的pSibling,原始链表中N,指向S,则在复制链表中,N'指向S',由于哈希表,可用O(1)时间找到S'。

方法二:时间复杂度为O(n),空间复杂度为O(1).

第一步,复制原始链表的每个节点N创建N',连在N后面;

第二步,设置复制链表的pSibling,原始链表中N,指向S,则在复制链表中,N'->pSibling指向N->pSibling->next;

第三步,把长链表拆分,奇数位置的节点用->next连接起来,就是原始链表。

代码:

/*
struct RandomListNode {
    int label;
    struct RandomListNode *next, *random;
    RandomListNode(int x) :
            label(x), next(NULL), random(NULL) {
    }
};
*/
class Solution {
public:
    void CopyListNode(RandomListNode* pHead)
    {
        RandomListNode* pNode=pHead;  // key step,or update pHead;
        while(pNode)
        {
            RandomListNode* pCloned = new RandomListNode(pNode->label);
            // pCloned->label=pNode->label;
            pCloned->next=pNode->next;
            pCloned->random=nullptr;
            pNode->next=pCloned;
            pNode=pCloned->next;
        }
    }
    void LinkRandom(RandomListNode* pHead)
    {
        RandomListNode* pNode=pHead;
        while(pNode)
        {
            RandomListNode* pCloned=pNode->next;
            if(pNode->random!=nullptr)
                pCloned->random=pNode->random->next;
            pNode=pCloned->next;
        }
    }
    RandomListNode* divide(RandomListNode* pHead)
    {
        RandomListNode* pNode=pHead;  // two points represent two linklists
        RandomListNode* pClonedHead=nullptr;
        RandomListNode* pClonedNode=nullptr;
        if(pNode)
        {
            pClonedHead=pClonedNode=pNode->next;
            pNode->next=pClonedNode->next;
            pNode=pNode->next;
        }
        while(pNode)
        {
            pClonedNode->next=pNode->next;
            pClonedNode=pClonedNode->next;
            pNode->next=pClonedNode->next;
            pNode=pNode->next;
        }
        return pClonedHead;
    }
    RandomListNode* Clone(RandomListNode* pHead)
    {
        CopyListNode(pHead);
        LinkRandom(pHead);
        return divide(pHead);
    }
};

 

你可能感兴趣的:(剑指offer)