复杂链表的复制
来源:互联网 发布:网络视频产业发展趋势 编辑:程序博客网 时间:2024/05/19 02:21
问题:请实现函数ComplexListNode* Clone(ComplexListNode* pHead)复制一个复杂链表。(分解让复杂的问题简单化)结点的C++定义如下:
struct ComplexListNode
{
int m_nValue;
ComplexListNode* m_pNext;
ComplexListNode* m_pSibling;
};
解法的思想如下:
第一步:根据原始链表的每个结点N创建对应的N*;
第二步: 设置复制出来的结点的m_pSibling;
第三步:把这个长链表拆分成两个链表。
详细的实现代码如下:
ComplexListNode* CreateNode(int nValue){ ComplexListNode* pNode = new ComplexListNode(); pNode->m_nValue = nValue; pNode->m_pNext = NULL; pNode->m_pSibling = NULL; return pNode;}void BuildNodes(ComplexListNode* pNode, ComplexListNode* pNext, ComplexListNode* pSibling){ if(pNode != NULL) { pNode->m_pNext = pNext; pNode->m_pSibling = pSibling; }}void PrintList(ComplexListNode* pHead){ ComplexListNode* pNode = pHead; while(pNode != NULL) { printf("The value of this node is: %d.\n", pNode->m_nValue); if(pNode->m_pSibling != NULL) printf("The value of its sibling is: %d.\n", pNode->m_pSibling->m_nValue); else printf("This node does not have a sibling.\n"); printf("\n"); pNode = pNode->m_pNext; }}
#include "stdafx.h"#include "ComplexList.h"void CloneNodes(ComplexListNode* pHead);void ConnectSiblingNodes(ComplexListNode* pHead);ComplexListNode* ReconnectNodes(ComplexListNode* pHead);ComplexListNode* Clone(ComplexListNode* pHead){ CloneNodes(pHead); ConnectSiblingNodes(pHead); return ReconnectNodes(pHead);}//第一步void CloneNodes(ComplexListNode* pHead){ ComplexListNode* pNode = pHead; while(pNode != NULL) { ComplexListNode* pCloned = new ComplexListNode(); pCloned->m_nValue = pNode->m_nValue; pCloned->m_pNext = pNode->m_pNext; pCloned->m_pSibling = NULL; pNode->m_pNext = pCloned; pNode = pCloned->m_pNext; }}//第二步void ConnectSiblingNodes(ComplexListNode* pHead){ ComplexListNode* pNode = pHead; while(pNode != NULL) { ComplexListNode* pCloned = pNode->m_pNext; if(pNode->m_pSibling != NULL) { pCloned->m_pSibling = pNode->m_pSibling->m_pNext; } pNode = pCloned->m_pNext; }}//第三步ComplexListNode* ReconnectNodes(ComplexListNode* pHead){ ComplexListNode* pNode = pHead; ComplexListNode* pClonedHead = NULL; ComplexListNode* pClonedNode = NULL; if(pNode != NULL) { pClonedHead = pClonedNode = pNode->m_pNext; pNode->m_pNext = pClonedNode->m_pNext; pNode = pNode->m_pNext; } while(pNode != NULL) { pClonedNode->m_pNext = pNode->m_pNext; pClonedNode = pClonedNode->m_pNext; pNode->m_pNext = pClonedNode->m_pNext; pNode = pNode->m_pNext; } return pClonedHead;}// ====================测试代码====================void Test(char* testName, ComplexListNode* pHead){ if(testName != NULL) printf("%s begins:\n", testName); printf("The original list is:\n"); PrintList(pHead); ComplexListNode* pClonedHead = Clone(pHead); printf("The cloned list is:\n"); PrintList(pClonedHead);}// -----------------// \|/ |// 1-------2-------3-------4-------5// | | /|\ /|\// --------+-------- |// -------------------------void Test1(){ ComplexListNode* pNode1 = CreateNode(1); ComplexListNode* pNode2 = CreateNode(2); ComplexListNode* pNode3 = CreateNode(3); ComplexListNode* pNode4 = CreateNode(4); ComplexListNode* pNode5 = CreateNode(5); BuildNodes(pNode1, pNode2, pNode3); BuildNodes(pNode2, pNode3, pNode5); BuildNodes(pNode3, pNode4, NULL); BuildNodes(pNode4, pNode5, pNode2); Test("Test1", pNode1);}// m_pSibling指向结点自身// -----------------// \|/ |// 1-------2-------3-------4-------5// | | /|\ /|\// | | -- |// |------------------------|void Test2(){ ComplexListNode* pNode1 = CreateNode(1); ComplexListNode* pNode2 = CreateNode(2); ComplexListNode* pNode3 = CreateNode(3); ComplexListNode* pNode4 = CreateNode(4); ComplexListNode* pNode5 = CreateNode(5); BuildNodes(pNode1, pNode2, NULL); BuildNodes(pNode2, pNode3, pNode5); BuildNodes(pNode3, pNode4, pNode3); BuildNodes(pNode4, pNode5, pNode2); Test("Test2", pNode1);}// m_pSibling形成环// -----------------// \|/ |// 1-------2-------3-------4-------5// | /|\// | |// |---------------|void Test3(){ ComplexListNode* pNode1 = CreateNode(1); ComplexListNode* pNode2 = CreateNode(2); ComplexListNode* pNode3 = CreateNode(3); ComplexListNode* pNode4 = CreateNode(4); ComplexListNode* pNode5 = CreateNode(5); BuildNodes(pNode1, pNode2, NULL); BuildNodes(pNode2, pNode3, pNode4); BuildNodes(pNode3, pNode4, NULL); BuildNodes(pNode4, pNode5, pNode2); Test("Test3", pNode1);}// 只有一个结点void Test4(){ ComplexListNode* pNode1 = CreateNode(1); BuildNodes(pNode1, NULL, pNode1); Test("Test4", pNode1);}// 鲁棒性测试void Test5(){ Test("Test5", NULL);}int _tmain(int argc, _TCHAR* argv[]){ Test1(); Test2(); Test3(); Test4(); Test5(); return 0;}
0 0
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复制复杂的链表
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- aapt
- android与js交互的方式(包括三种)
- UIScrollView 的基本使用
- 梯度训练算法
- 无刷直流电机的驱动的基本原理
- 复杂链表的复制
- C#进程间使用同步EVENT事件
- iOS通知观察者的添加和移除
- TextInputLayout的学习和应用
- java.net.BindException: Address already in use解决方法
- 尝试新思路——CError的另一种实现方式
- Ubuntu16.04安装jdk1.8(tar.gz方式)
- React Router 使用教程
- java高级程序设计笔记(8章 BOM)