面试题35:复杂链表的复制
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
用的书本上的算法:注意确定边界值
struct RandomListNode { int label; struct RandomListNode *next, *random; RandomListNode(int x) : label(x), next(NULL), random(NULL) { } }; class Solution { public: //1.在原链表中插入复制链表并确定next指向 void InsertIntoList(RandomListNode* pHead) { RandomListNode* p=pHead; while(p!=nullptr) { //新建一个节点 RandomListNode* pClone=new RandomListNode(0); pClone->random=nullptr; pClone->label=p->label; pClone->next=p->next; p->next=pClone; p=pClone->next; } } //2.确定random指向 void PutRandom(RandomListNode* pHead) { RandomListNode* p=pHead,*pClone=pHead->next; while(p!=nullptr&&pClone!=nullptr) { if(p->random) { pClone->random=p->random->next; } p=pClone->next; if(p!=nullptr) pClone=p->next; } } //3.拆分原链表和复制的链表 RandomListNode* SplitList(RandomListNode* pHead) { RandomListNode* p=pHead,*pClone=p->next,*pCloneHead=pClone; while(pClone!=nullptr) { p->next=pClone->next; p=pClone->next; if(p==nullptr) { pClone->next=nullptr; break; } pClone->next=p->next; pClone=p->next; } return pCloneHead; } RandomListNode* Clone(RandomListNode* pHead) { if(pHead==nullptr) return nullptr; InsertIntoList(pHead); PutRandom(pHead); RandomListNode* pCloneHead=SplitList(pHead); return pCloneHead; } };