面试题26复杂链表的复制 思路:最笨的方法就是先复制原始链表上的每一个结点,然后再逐个设置每个结点的sibling 指针,每设置一个sibling 指针都得从新遍历一遍原始的单链表,或是在复制原始链表上的每个结点时把<N,N'>配对信息放到哈希表中
//创新的解法: 分三个步骤。第一步将复制原始链表的每一个结点N,创建出新节点N'并链接到N的后面,第二步设置每个复制节点N'的sibling指针域,第三步将长链表拆分成两个链表
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
//面试题26复杂链表的复制 思路:最笨的方法就是先复制原始链表上的每一个结点,然后再逐个设置每个结点的sibling 指针,每设置一个sibling 指针都得从新遍历一遍原始的单链表,或是在复制原始链表上的每个结点时把<N,N'>配对信息放到哈希表中
//创新的解法: 分三个步骤。第一步将复制原始链表的每一个结点N,创建出新节点N'并链接到N的后面,第二步设置每个复制节点N'的sibling指针域,第三步将长链表拆分成两个链表
typedef struct ComplexListNode
{
int data;
ComplexListNode *next,*sibling;
}ComplexListNode;
//第一步 将复制原始链表的每一个结点N,创建出新节点N'并链接到N的后面
void CloneNodes(ComplexListNode* pHead)//画图示意一下
{
if(pHead==NULL)
{
return;
}
ComplexListNode *pNode=pHead;
while(pNode!=NULL)
{
ComplexListNode *pCloned=new ComplexListNode;
pCloned->data=pNode->data;
pCloned->next=pNode->next;
pCloned->sibling=NULL;
pNode->next=pCloned;
pNode=pCloned->next;
}
}
//第二步设置每个复制节点N'的sibling指针域
void ConnectSiblingNodes(ComplexListNode*pHead)//画图示意一下
{
if(pHead==NULL)
{
return;
}
ComplexListNode *pNode=pHead;
ComplexListNode *pClonedNode=NULL;
while(pNode!=NULL)
{
pClonedNode=pNode->next;
pClonedNode->sibling=pNode->sibling->next;
pNode=pClonedNode->next;
}
}
//第三步:第三步将长链表拆分成两个链表
ComplexListNode* ReconnectNodes(ComplexListNode*pHead)//画图示意一下
{
if(pHead==NULL)
{
return NULL;
}
ComplexListNode *pNode=pHead;
ComplexListNode *pClonedHead=pNode->next;
ComplexListNode* pClonedNode=NULL;
while(pNode!=NULL)
{
pClonedNode=pNode->next;
pNode->next=pClonedNode->next;
pClonedNode->next=pNode->next;
pNode=pNode->next;
pClonedNode=pClonedNode->next;
}
return pClonedHead;
}
// 将三个步骤整合一下
ComplexListNode *CloneComplexList(ComplexListNode*pHead)
{
if(pHead==NULL)
{
return;
}
CloneNodes(pHead);//第一步 将复制原始链表的每一个结点N,创建出新节点N'并链接到N的后面
ConnectSiblingNodes(pHead);//第二步设置每个复制节点N'的sibling指针域
return ReconnectNodes(pHead);//第三步:第三步将长链表拆分成两个链表
}
int main()
{
return 0;
}