微软100题(76)复杂链表的复制
2015-06-11 10:25
281 查看
复杂链表的复制(链表、算法)
题目:有一个复杂链表,其结点除了有一个m_pNext指针指向下一个结点外,
还有一个m_pSibling指向链表中的任一结点或者NULL。其结点的C++定义如下:
struct ComplexNode
{
int m_nValue;
ComplexNode* m_pNext;
ComplexNode* m_pSibling;
};
下图是一个含有5个结点的该类型复杂链表。
图中实线箭头表示m_pNext指针,虚线箭头表示m_pSibling指针。为简单起见,
指向NULL的指针没有画出。
请完成函数ComplexNode* Clone(ComplexNode* pHead),以复制一个复杂链表。
思路:分多步完成,第一步,复制结点到后么变成
A——A'——B——B'——C——C'结构
第二步 串联A' B' C'的m_pSiling
第三步 拆开成原链表 和 复制后的链表
第一步:复制
第二步:链接
第三步:拆
最后,合并上面三部
题目:有一个复杂链表,其结点除了有一个m_pNext指针指向下一个结点外,
还有一个m_pSibling指向链表中的任一结点或者NULL。其结点的C++定义如下:
struct ComplexNode
{
int m_nValue;
ComplexNode* m_pNext;
ComplexNode* m_pSibling;
};
下图是一个含有5个结点的该类型复杂链表。
图中实线箭头表示m_pNext指针,虚线箭头表示m_pSibling指针。为简单起见,
指向NULL的指针没有画出。
请完成函数ComplexNode* Clone(ComplexNode* pHead),以复制一个复杂链表。
思路:分多步完成,第一步,复制结点到后么变成
A——A'——B——B'——C——C'结构
第二步 串联A' B' C'的m_pSiling
第三步 拆开成原链表 和 复制后的链表
第一步:复制
void CloneNodes(ComplexListNode* phead) { ComplexListNode* pnode = phead; while (pnode != NULL) { ComplexListNode* pClone = new ComplexListNode(); pClone->m_nValue = pnode->m_nValue; pClone->m_pnext = pnode->m_pnext; pClone->m_pSibling = NULL; pnode->m_pnext = pClone; pnode = pClone->m_pnext; } }
第二步:链接
void CopySiblingNodes(ComplexListNode* phead) { ComplexListNode* pnode = phead; while (pnode!=NULL) { ComplexListNode* pClone = pnode->m_pnext; if(pnode->m_pSibling!=NULL) { pClone->m_pSibling = pnode->m_pSibling->m_pnext; } pnode = pClone->m_pnext; } }
第三步:拆
ComplexListNode* Reconnect(ComplexListNode* phead) { ComplexListNode* pnode = phead; ComplexListNode* pCloneHead = NULL; ComplexListNode* pCloneNode = NULL; if(pnode!=NULL) { pCloneHead = pCloneNode = pnode->m_pnext; pnode->m_pnext = pCloneNode->m_pnext; pnode = pnode->m_pnext; } while(pnode!=NULL) { pCloneNode->m_pnext = pnode->m_pnext; pCloneNode = pCloneNode->m_pnext; pnode->m_pnext = pCloneNode->m_pnext; pnode = pnode->m_pnext; } return pCloneHead; }
最后,合并上面三部
ComplexListNode* Clone(ComplexListNode* phead) { CloneNodes(phead); CopySiblingNodes(phead); return Reconnect(phead); }
相关文章推荐
- 阅读《构建之法》第10、11、12章
- Win10值得关注的安全功能
- 适配iOS 8
- linux处理目录的常用命令
- Android为应用在桌面添加一个快捷方式
- 黑马程序员--异常处理
- 2014ACM/ICPC亚洲区西安站 F题 color (组合数学,容斥原理)
- 水平居中设置-定宽块状元素
- 水平居中设置-行内元素
- Delphi XE8中开发DataSnap程序常见问题和解决方法 (二)想对DBExpress的TSQLDataSet写对数据库操作的SQL语句出错了!
- 一种巧妙的设计--通过继承扩展接口
- JSP之EL表达式
- Android数据库高手秘籍——使用LitePal升级表
- 欢迎使用CSDN-markdown编辑器
- CSP开发基础--CSP入门简介
- C++ 10.3.6 查找并读取map中的元素
- Delphi XE8中开发DataSnap程序常见问题和解决方法 (二)想对DBExpress的TSQLDataSet写对数据库操作的SQL语句出错了!
- Session的缓存
- Fair Scheduler中的Delay Schedule分析
- JQuery包裹DOM节点的方法