复杂链表的复制

来源:互联网 发布:正装衬衫 知乎 编辑:程序博客网 时间:2024/06/04 20:07

一,题目

实现ComplexListNodeClone函数,复制一个复杂链表;

复杂链表为:

         有一个复杂链表,其结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任一结点或者NULL。


二,编程思路

方案一:

1,复制每个结点N,然后把创建出来的每个结点N用m_pnext连接起来。同时保存它们的配对信息。

2,设置复制链表的信息m_psibling。

以空间换取时间。


方案二:

给每个原始结点后面链接一个结点。是前一个结点的复制。


所以配对时直接用复制的结点指向原始执行结点的下一个。


最后再把链表拆分,把奇数位用m_pnext连接起来就是原始的链表,把偶数位连接起来就是复制链表。

第一步


第二步

第三步



三,代码实现

#pragma once


#include<iostream>
#include<stack>
using namespace std;


struct ComplexListNode
{
int m_nvalue;//结点值
ComplexListNode* m_pNext;//指针指向下一个结点
ComplexListNode* m_pSibling;//指向链表中任意结点或者NULL
};


//复制链表并把复制的每个结点放到原始节点之后
void NodeClone(ComplexListNode* pHead)
{
ComplexListNode* pNode = pHead;
while (pNode != NULL)
{
ComplexListNode* pNewNode = new ComplexListNode();
pNewNode->m_nvalue = pNode->m_nvalue;//赋值
pNewNode->m_pNext = pNode->m_pNext;
pNewNode->m_pSibling = NULL;
pNode->m_pNext = pNewNode;
pNode = pNewNode->m_pNext;
}
}
//设置复制出来结点的m_psibling
void ConnectSiblingNode(ComplexListNode* pHead)
{
ComplexListNode* pNode = pHead;
while (pNode != NULL)
{
ComplexListNode* pNewNode = pNode->m_pNext;
if (pNode->m_pSibling != NULL)
{
pNewNode->m_pSibling = pNode->m_pSibling->m_pNext;
}
pNode = pNewNode->m_pNext;
}
}
//把奇结点拿出来形成原始链表,偶结点拿出来形成复制链表
ComplexListNode* SplitListNode(ComplexListNode* pHead)
{
ComplexListNode* pNode = pHead;
ComplexListNode* pNewNode = NULL;
ComplexListNode* pNewHead = NULL;
if (pNode != NULL)
{
pNewNode = pNode->m_pNext;
pNewHead = pNewNode;
pNode->m_pNext = pNewNode->m_pNext;
pNode = pNode->m_pNext;
}
while (pNode != NULL)
{
pNewNode->m_pNext = pNode->m_pNext;
pNewNode = pNewNode->m_pNext;
pNode->m_pNext = pNewNode->m_pNext;
pNode = pNode->m_pNext;
}
return pNewHead;
}


void deleteList(ComplexListNode* pHead)
{
while (pHead != NULL)
{
ComplexListNode* pNext = pHead->m_pNext;
delete pHead;
pHead = pNext;
}


}


ComplexListNode* CloneNode(ComplexListNode* pHead)
{
NodeClone(pHead);
ConnectSiblingNode(pHead);
ComplexListNode* ret = SplitListNode(pHead);
return ret;
}
void Test()
{
ComplexListNode* N1 = new ComplexListNode;
ComplexListNode* N2 = new ComplexListNode;
ComplexListNode* N3 = new ComplexListNode;
ComplexListNode* N4 = new ComplexListNode;
ComplexListNode* N5 = new ComplexListNode;




N1->m_pNext = N2;
N2->m_pNext = N3;
N3->m_pNext = N4;
N4->m_pNext = N5;
N5->m_pNext = NULL;
N1->m_nvalue = 1;
N2->m_nvalue = 2;
N3->m_nvalue = 3;
N4->m_nvalue = 4;
N5->m_nvalue = 5;
N1->m_pSibling = N3;
N2->m_pSibling = N5;
N3->m_pSibling = NULL;
N4->m_pSibling = N2;
N5->m_pSibling = NULL;


cout << N1->m_nvalue << "->";
cout << N2->m_nvalue << "->";
cout << N3->m_nvalue << "->";
cout << N4->m_nvalue << "->";
cout << N5->m_nvalue<<endl;
cout << endl;


ComplexListNode* cur = CloneNode(N1);
while (cur)
{
cout <<cur->m_nvalue <<" ";
cur = cur->m_pNext;
}
deleteList(N1);
deleteList(N2);
deleteList(N3);
deleteList(N4);
deleteList(N5);

}


主函数:

#define _CRT_SECURE_NO_WARNINGS 1


#include"CloneComplexListNode.h"


int main()
{
Test();
system("pause");
return 0;
}

四,运行结果



0 0