您的位置:首页 > 其它

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

2018-03-01 12:53 991 查看
(1)链表为空的情况if(!pHead)
{
return;
}(2)链表只有一个节点的情况以及在遍历链表的过程中考虑当前只有一个结点的情况
从头遍历链表,对每一个节点复制一个,插在它后边;接着遍历这个链表,那么原链表中节点的特殊指针若为空,则复制链表对应节点的特殊指针也为空,若源链表中结点的特殊指针不为空,那复制链表中对应节点的特殊指针为原链表中结点特殊指针的->next。
class Solution {  
public:  
    RandomListNode* Clone(RandomListNode* pHead)  
    {  
        if (!pHead)  
        {  
            return NULL;  
        }  
        RandomListNode* pNode = pHead;  
        RandomListNode* nextNode = pNode->next;  
        while (pNode)  
        {  
            RandomListNode *temp = new RandomListNode(pNode->label);  
            pNode->next = temp;  
            temp->next = nextNode;  
            pNode = temp->next;//新的起点  
            if (pNode)  
            {  
                nextNode = pNode->next;//这里是判断链表本身只有一个结点时和遍历到最后时两种情况  
            }  
        }//每个节点复制一次,连接起来,间隔构成两个单链表  

        //下边是要扫描链表,求random指针  
        pNode = pHead;  
        while (pNode)  
        {  
            if (!pNode->random)  
            {  
                pNode->next->random = NULL;  
            }  
            else  
                pNode->next->random = pNode->random->next;  
            pNode = pNode->next->next;  
        }  
        //下边就是要拆开了  
        RandomListNode* ClonepHead = pHead->next;  
        RandomListNode* ClonepNode = ClonepHead;  
        pNode = pHead;  
        while (pNode)  
        {  
            pNode->next = ClonepNode->next;  
            pNode = pNode->next;  
            if (pNode)//遍历过程中需要判断链表本身只有一个结点时和遍历到最后时两种情况  
            {  
                ClonepNode->next = pNode->next;  
                ClonepNode = ClonepNode->next;  
            }  
        }  
        return ClonepHead;  
    }  
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐