码迷,mamicode.com
首页 > 其他好文 > 详细

复杂链表的复制

时间:2014-12-04 00:58:23      阅读:116      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   http   color   使用   sp   on   div   

题目:有一个复杂链表,除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任一结点或者NULL。结点的C++定义如下:

1 struct ComplexNode
2 {
3     int m_nValue;
4     ComplexNode* m_pNext;
5     ComplexNode* m_pSibling;
6 };

完成复制链表的函数ComplexNode* Clone(ComplexNode* pHead)。

解答:不使用辅助空间,实现O(n)的效率。分三步:

(1) 对于原始的每个结点N,复制对应的N‘,把N‘链接在N的后面。

(2) 设置复制出来的结点的m_pSibling。

(3) 拆分链表。

第一步的代码:

 1 void CloneNodes(ComplexNode* pHead)
 2 {
 3     ComplexNode *pNode = pHead;
 4     while (pNode != NULL)
 5     {
 6         ComplexNode* pCloned = new ComplexNode();
 7         pCloned->m_nValue = pNode->m_nValue;
 8         pCloned->m_pNext = pNode->m_pNext;
 9         pCloned->m_pSibling = NULL;
10 
11         pNode->m_pNext = pCloned;
12         pNode = pNode->m_pNext;
13     }
14 }

第二步的代码:

 1 void ConnectSiblingNodes(ComplexNode* pHead)
 2 {
 3     ComplexNode* pNode = pHead;
 4     while (pNode != NULL)
 5     {
 6         ComplexNode* pCloned = pNode->m_pNext;
 7         if (pNode->m_pSibling != NULL)
 8         {
 9             pCloned->m_pSibling = pNode->m_pSibling->m_pNext;
10         }
11         pNode = pCloned->m_pNext;
12     }
13 }

第三步的代码:

 1 ComplexNode* ReconnectNodes(ComplexNode* pHead)
 2 {
 3     ComplexNode* pNode = pHead;
 4     ComplexNode* pClonedHead = NULL;
 5     ComplexNode* pClonedNode = NULL;
 6 
 7     if (pNode != NULL)
 8     {
 9         pClonedHead = pClonedNode = pNode->m_pNext;
10         pNode->m_pNext = pClonedNode->m_pNext;
11         pNode = pNode->m_pNext;
12     }
13 
14     while (pNode != NULL)
15     {
16         pClonedNode->m_pNext = pNode->m_pNext;
17         pClonedNode = pClonedNode->m_pNext;
18 
19         pNode->m_pNext = pClonedNode->m_pNext;
20         pNode = pNode->m_pNext;
21     }
22 
23     return pClonedHead;
24 }

把三步合起来,就是复制链表的完整过程:

1 ComplexNode* Clone(ComplexNode* pHead)
2 {
3     CloneNodes(pHead);
4     ConnectSiblingNodes(pHead);
5     return ReconnectNodes(pHead);
6 }

参考:http://zhedahht.blog.163.com/blog/static/254111742010819104710337/

复杂链表的复制

标签:des   style   blog   http   color   使用   sp   on   div   

原文地址:http://www.cnblogs.com/litao-tech/p/4141597.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!