【剑指offer】面试题26:复杂链表的复制

题目:

输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点)。

思路:

复制自身到下一个结点;

设置新结点的random指针;

分离链表。

注意:判断输入参数,只需要判断是不是空指针就行了。(之前判断当只有一个结点时直接返回。。。那全部直接返回输入参数就是了~~~)

代码:

/*
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 || pHead->next==NULL)  return pHead;  当有一个结点的时候,不能直接返回啊,要复制~~
        if(pHead==NULL)  return NULL;
        
        copy(pHead);
        setNewNodeRandom(pHead);
        RandomListNode *res=splice(pHead);
        
        return res;
    }
private:
    void copy(RandomListNode *pHead)
    {
        while(pHead!=NULL)
        {
            RandomListNode *newnode=new RandomListNode(pHead->label);
            newnode->next=pHead->next;
            //newnode->random=pHead->random; 新结点的random指针应先不设置
            RandomListNode *nextp=pHead->next;//原来的next结点
            pHead->next=newnode;//指向新结点
            pHead=nextp;
        }
    }
    
    void setNewNodeRandom(RandomListNode *pHead)
    {
        while(pHead!=NULL)
        {
            RandomListNode *nextp=pHead->next;
            nextp->random=pHead->random;
            pHead=nextp->next;
        }
    }
    
    RandomListNode* splice(RandomListNode *pHead)
    {
        RandomListNode *newHead=pHead->next;
        RandomListNode *head=newHead;
        while(newHead->next!=NULL)
        {
            pHead->next=newHead->next;
            pHead=newHead->next;
            
            newHead->next=pHead->next;
            newHead=pHead->next;
        }
        pHead->next=NULL;
        
        return head;
    }
};
原文地址:https://www.cnblogs.com/buxizhizhou/p/4706130.html