复杂链表的复制
来源:互联网 发布:课堂直播软件 编辑:程序博客网 时间:2024/06/05 09:03
题目:请实现函数,复制一个复杂链表。在复杂链表中,每一个节点除了有一个m_pNext指针指向下一个节点外,还有一个m_pSibling只想链表中的任意节点或者NULL。节点定义如下:
struct ComplexNode{ int m_nValue; ComplexNode* m_pNext; ComplexNode* m_pSibling;};
方法:
第一步,根据原始链表的每一个节点N创建对应的N’,将N’连接在N的后面。如图
完成这一步的代码如下:
void CloneNodes(ComplexNode* pHead) { ComplexNode* pNode = pHead; while(pNode != NULL) { ComplexNode *pCloned = new ComplexNode(); pCloned->m_nValue = pNode->m_nValue; pCloned->m_pNext = pNode->m_pNext; pCloned->m_pSibling = NULL; pNode->m_pNext = pCloned; //将新复制的结点链接在原始结点的后面 pNode = pCloned->m_pNext; } }
第二部设置复制出来的节点m_pSibling。假设原始链表上的N的m_pSibling指向节点S,那么其对应复制出来的N’是N的m_pNext指向的结点,同样S’也是S的m_pNext指向的结点。设置m_pSibling之后的链表如图所示:
第二步代码如下:
void ConnectSiblingNodes(ComplexNode* pHead) { ComplexNode* pNode = pHead; while(pNode != NULL) //遍历链表更新随机指针 { ComplexNode *pCloned = pNode->m_pNext; if(pNode->m_pSibling != NULL) { pCloned->m_pSibling = pNode->m_pSibling->m_pNext; //新复制结点的随机指针就是原始结点的随机指针指向的结点的下一个结点 } pNode = pCloned->m_pNext; } }
第三步把这个长链表长分成两个链表:把奇书位置的结点用m_pNext连接起来就是原始链表,把偶数位置的结点用m_pNext连接起来就是复制出来的链表。如下图
对应代码如下:
ComplexNode* ReconnectNodes(ComplexNode* pHead) { ComplexNode* pNode = pHead; ComplexNode* pClonedHead = NULL; ComplexNode* 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; }
将上面三部整合起来,就是复制链表的完整过程。
ComplexNode* Clone(ComplexNode* pHead) { CloneNodes( pHead ); ConnectSiblingNodes( pHead ); return ReconnectNodes( pHead ); }
阅读全文
0 0
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复制复杂的链表
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 【Java TCP/IP Socket】构建和解析自定义协议消息(含代码)
- VirtualBox虚拟机网络设置
- mysql中的<=>
- 解决Ubuntu无法上网的问题
- 连连看-二维数组实现简单的生成随机数,消除两个数相同
- 复杂链表的复制
- 时间类型转换
- Java 循环结构
- NYOJ 15-括号匹配(二)(经典区间DP)
- Oracle中TO_DATE TO_CHAR格式
- CDH5.X完全卸载步骤
- MOOC清华《程序设计基础》第6章:三种递推方法求兔子数列问题(斐波那契数列)
- 关于4. 3 DESIGN: SPAM 审核问题的解决方法
- poj 2528 特殊离散化+线段树