复杂链表的复制
2016-03-07 10:18
387 查看
复杂链表不会创建,为了熟悉思想就从书中抠出来一些内容。
题目描述:输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点)。
算法思想:
题目描述:输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点)。
算法思想:
//复杂链表结构 struct ComplexListNode { int m_nValue; ComplexListNode* m_pNext; ComplexListNode* m_pSibling; } //1.根据原始链表的每个节点N创建对应的N' void CloneNodes(ComplexListNode* pHead) { ComplexListNode* pNode = pHead; ComplexListNode* pCloned = NULL; while(pNode != NULL) { ComplexListNode* pNode = 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; } } //2.设置出来的结点的m_pSibling void ConnectSiblingNodes(ComplexListNode* pHead) { ComplexListNode* pNode = pHead; ComplexListNode* pCloned = NULL; while(pNode != NULL) { pCloned = pNode->m_pNext; while(pNode->m_pSibling != NULL) { pCloned->m_pSibling = pNode->m_pSibling->m_pNext; } pNode = pCloned->m_pNext; } } //3.把长链表分成两个链表 ComplexListNode* ReconnectNodes(ComplextListNode* 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; } //4.把上面3步合起来 ComplexListNode* Clone(ComplextListNode* pHead) { CloneNodes(pHead); ConnectSiblingNodes(pHead); return ReconnectNodes(pHead); }
相关文章推荐
- nginx mod_zip
- Git:git常用命令
- Android Studio插件
- ImageView中图片上下有余白
- Android应用开发中如何使用隐藏API
- IO多路复用之select总结
- Android binder (5): Media Server的初始化
- Xcode快捷操作
- Android PreferenceFragment
- iOS 简单push和present混用退回根视图方法
- 一次SSL证书切换之后的故障排查
- 上线 之 上架AppStore10个大坑(下)
- IOS的AppDelegate方法中的事件触发调用
- OC字符串的常用方法
- 利用Nginx第三方模块,实现附件打包下载
- 30还是个程序员
- Maven中的profile标签简介
- Android 开发60条技术经验总结
- Delphi 操作Word怎么控制光标的位置
- js 开源k线图开发库