面试题26.复杂链表的复制
2015-08-29 20:09
579 查看
题目:请实现函数ComplexListNode* Clone(ComplexListNode* pHead),复制一个复杂链表,在复杂
链表中,每个结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任意
结点或者NULL。
结点的C++定义如下:
本题以链表:
为例,
其中各个元素的Sibling如下:
第一个结点的sibling指向结点5
第二个结点的sibling指向结点9
第三个结点的sibling为NULL
第四个结点的sibling为第二个结点
第五个结点的sibling为NULL
此题目的解题步骤分为以下三步:
Step 1.将链表中每个结点复制一个链接在其后面
Step 2.解决链表的sibling问题
比如第一个结点的sibling为第三个结点,
那么可以遍历链表使
Step 3.此时将链表的偶数结点取出来即可,取出来即为复制的结点。
代码如下:
运行截图:
链表中,每个结点除了有一个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; }
运行截图:
相关文章推荐
- 面试知识总结
- 【面试ing】腾讯模拟笔试
- lintCode-给出若干闭合区间,合并所有重叠的部分。
- 黑马程序员——33集合
- 剑指offer-第六章面试中的各项能力(二叉树的深度)
- 剑指offer-第六章面试中的各项能力(二叉树的深度)
- 求职就业
- 黑马程序员--Java反射
- 黑马程序员—————Java基础--------IO流(二)
- C 面试题选(一)
- 黑马程序员 反射
- 程序员面试中常见10大算法汇总
- 程序员面试中常见10大算法汇总
- 教你如何迅速秒杀掉:99%的海量数据处理面试题
- 黑马程序员——Java之内部类
- 黑马程序员--Java_IO流(二)
- C#程序员开发WinForm必须知道的 Window 消息大全(转)
- 2015/8/28的面试题
- 剑指Offer面试题:14.链表的倒数第k个节点
- 程序员面试金典1.8:判断翻转子串