剑指offer26 复杂链表的复制
/* struct RandomListNode { int label; struct RandomListNode *next, *random; RandomListNode(int x) : label(x), next(NULL), random(NULL) { } }; */ class Solution { public: RandomListNode* Duplicate(RandomListNode* pHead) { RandomListNode* p=pHead; while(p) { RandomListNode* temp=(RandomListNode*)malloc(sizeof(RandomListNode)); temp->label=p->label; temp->next=p->next; p->next=temp; p=temp->next; } return pHead; } RandomListNode* RandomList(RandomListNode* pHead) { RandomListNode* p=pHead; RandomListNode* pnext=NULL; while(p) { pnext=p->next; if(p->random) { pnext->random=p->random->next; } p=pnext->next; } return pHead; } RandomListNode* split(RandomListNode* pHead) { RandomListNode* result=pHead->next; RandomListNode* p=pHead; RandomListNode* p1=result; while(p) { p->next=p1->next; p=p->next; if(p) { p1->next=p->next; p1=p1->next; } } return result; } RandomListNode* Clone(RandomListNode* pHead) { if(!pHead) return NULL; RandomListNode* p1=Duplicate(pHead); RandomListNode* p2=RandomList(p1); RandomListNode* result=split(p2); return result; } };
要注意各种指针为空的边界条件。在split函数中,必须一趟完成两个链表的拆分,不然就会出现超时错误。