题目描述
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
代码如下:
void CloneNode(RandomListNode* pHead) { RandomListNode* pNode=pHead; while(pNode!=NULL) { RandomListNode* node=new RandomListNode(0); node->label=pNode->label; node->next=pNode->next; node->random=NULL; pNode->next=node; pNode=node->next; } } //如果原始链表上的节点N的random指向S,则对应的复制节点N’的random指向S的下一个 void ConnectSiblingNode(RandomListNode* pHead) { RandomListNode* pNode=pHead; while(pNode) { RandomListNode*clone=pNode->next; if(pNode->random!=NULL) { clone->random=pNode->random->next; } pNode=clone->next; } } //把得到的链表拆成两个链表,奇数位置上的节点组成原始链表,偶数位置上的节点组成复制出俩的链表 RandomListNode *ReconectNode(RandomListNode *pHead) { RandomListNode*pNode=pHead; RandomListNode*pCloneHead=NULL; RandomListNode*pCloneNode=NULL; //初始化 if(pNode!=NULL) { pCloneHead=pCloneNode=pNode->next; pNode->next=pCloneNode->next; pNode=pNode->next; } //循环 while(pNode!=NULL) { pCloneNode->next=pNode->next; pCloneNode=pCloneNode->next; pNode->next=pCloneNode->next; pNode=pNode->next; } return pCloneHead; } //三合一 RandomListNode* Clone(RandomListNode* pHead) { //第一步产生克隆节点 CloneNode(pHead); ConnectSiblingNode(pHead); return ReconectNode(pHead); }