您的位置:首页 > 职场人生

面试题26.复杂链表的复制

2015-08-29 20:09 579 查看
题目:请实现函数ComplexListNode* Clone(ComplexListNode* pHead),复制一个复杂链表,在复杂

链表中,每个结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任意

结点或者NULL。

结点的C++定义如下:

struct ComplexListNode
{
  int m_nValue;
  ComplexListNode* m_pNext;
  ComplexListNode* m_pSibling;
}


本题以链表:

1->3->5->7->9


为例,

其中各个元素的Sibling如下:

第一个结点的sibling指向结点5

第二个结点的sibling指向结点9

第三个结点的sibling为NULL

第四个结点的sibling为第二个结点

第五个结点的sibling为NULL

此题目的解题步骤分为以下三步:

Step 1.将链表中每个结点复制一个链接在其后面

1->1->3->3->5->5->7->7->9->9


Step 2.解决链表的sibling问题

比如第一个结点的sibling为第三个结点,

那么可以遍历链表使

Node->next->sibling=Node->sibling


Step 3.此时将链表的偶数结点取出来即可,取出来即为复制的结点。

代码如下:

#include <iostream>
using namespace std;

struct ComplexListNode
{
int m_nValue;
ComplexListNode* m_pNext;
ComplexListNode* m_pSibling;
};

ComplexListNode* CreateLinkList()
{
ComplexListNode* Head;
Head=new ComplexListNode();
Head->m_nValue=1;
Head->m_pNext=NULL;
Head->m_pSibling=NULL;

ComplexListNode* Temp=Head;

ComplexListNode* Node2=new ComplexListNode();
Node2->m_nValue=3;
Node2->m_pNext=NULL;
Node2->m_pSibling=NULL;
ComplexListNode* Node3=new ComplexListNode();
Node3->m_nValue=5;
Node3->m_pNext=NULL;
Node3->m_pSibling=NULL;
ComplexListNode* Node4=new ComplexListNode();
Node4->m_nValue=7;
Node4->m_pNext=NULL;
Node4->m_pSibling=NULL;
ComplexListNode* Node5=new ComplexListNode();
Node5->m_nValue=9;
Node5->m_pNext=NULL;
Node5->m_pSibling=NULL;

Temp->m_pNext=Node2;
Temp=Temp->m_pNext;
Temp->m_pNext=Node3;
Temp=Temp->m_pNext;
Temp->m_pNext=Node4;
Temp=Temp->m_pNext;
Temp->m_pNext=Node5;
Temp=Temp->m_pNext;

ComplexListNode* TempNew1=Head;
TempNew1->m_pSibling=TempNew1->m_pNext->m_pNext;

ComplexListNode* TempNew2=Head;
TempNew2->m_pNext->m_pSibling=TempNew2->m_pNext->m_pNext->m_pNext->m_pNext;

ComplexListNode* TempNew3=Head;
TempNew3->m_pNext->m_pNext->m_pNext->m_pSibling=TempNew3->m_pNext;

ComplexListNode* TempNew4=Head;
TempNew4->m_pNext->m_pNext->m_pSibling=NULL;

ComplexListNode* TempNew5=Head;
TempNew4->m_pNext->m_pNext->m_pNext->m_pNext->m_pSibling=NULL;

return Head;
}

void PrintListLink(ComplexListNode* Head)
{
ComplexListNode *Temp=Head;
while(Temp!=NULL)
{
cout<<"Node Value: "<<Temp->m_nValue<<" ";
if(Temp->m_pSibling!=NULL)
cout<<"Sibling Value: "<<Temp->m_pSibling->m_nValue<<" ";
else
cout<<"Sibling Value:NULL";
Temp=Temp->m_pNext;
cout<<endl;
}
}

ComplexListNode* StepOneCopyAndLink(ComplexListNode* Head)
{
ComplexListNode* Temp=Head;

while(Temp!=NULL)
{
ComplexListNode* NewNode=new ComplexListNode();
NewNode->m_nValue=Temp->m_nValue;
NewNode->m_pNext=Temp->m_pNext;
Temp->m_pNext=NewNode;
Temp=NewNode->m_pNext;
}

return Head;
}

void StepTwoSiblingNode(ComplexListNode* Head)
{
ComplexListNode* Temp=Head;
while(Temp!=NULL)
{
if(Temp->m_pSibling!=NULL)
Temp->m_pNext->m_pSibling=Temp->m_pSibling;

Temp=Temp->m_pNext->m_pNext;
}
}

ComplexListNode* StepThreeDepartTheCopyLinkList(ComplexListNode* Head)
{
ComplexListNode* Head1=Head;
ComplexListNode* Head2=Head->m_pNext;
ComplexListNode* CopyHead=Head->m_pNext;

while(Head1->m_pNext->m_pNext!=NULL)
{
Head1->m_pNext=Head1->m_pNext->m_pNext;
Head1=Head1->m_pNext;

Head2->m_pNext=Head2->m_pNext->m_pNext;
Head2=Head2->m_pNext;
}

Head1->m_pNext=NULL;

return CopyHead;
}

int main(void)
{
ComplexListNode* Head;
Head=CreateLinkList();
cout<<"Original LinkList:"<<endl;
PrintListLink(Head);
ComplexListNode* NewHead;
NewHead=StepOneCopyAndLink(Head);
cout<<"Step1:Copy Node After Each Node"<<endl;
PrintListLink(NewHead);
StepTwoSiblingNode(NewHead);
cout<<"Step2:Copy Sibling Of Node"<<endl;
PrintListLink(NewHead);
cout<<"Step3:"<<endl;
ComplexListNode* CopyHead;
CopyHead=StepThreeDepartTheCopyLinkList(NewHead);
cout<<"The Old LinkList is:"<<endl;
PrintListLink(NewHead);
cout<<"The Copy LinkList is:"<<endl;
PrintListLink(CopyHead);
system("pause");
return 0;
}


运行截图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: