题目:
实现函数ComplexListNode* Clone(ComplexListNode* pHead), 复制一个复杂链表.在复杂链表中,每个结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任意结点或者NULL.结点定义如下:
struct ComplexListNode { int m_nValue; ComplexListNode* m_pNext; ComplexListNode* m_pSibling; };
如图,虚线为m_pSibling指针,没显示的表示指向NULL.
思路:
1. 从头结点开始复制每个结点,并且把每个结点连在当前结点后面.
2. 修改克隆结点的m_pSibling指针
3. 拆链表,反回克隆链表的头指针
//复制原始链表的每个结点.并且新的结点都连到原始链表当前结点的后面 //新节点的m_pSibling先置空 void CloneNodes(ComplexListNode* pHead) { if (pHead == NULL) return; ComplexListNode* pNow = pHead; while (pNow) { ComplexListNode* pClone = new ComplexListNode(0); pClone->m_pNext = pNow->m_pNext; pClone->m_pSibling = NULL; pNow->m_pNext = pClone; pNow = pClone->m_pNext; } } //克隆m_pSibling void CloneSibling(ComplexListNode* pHead) { ComplexListNode* pNow = pHead; while (pNow) { ComplexListNode* pClone = pNow->m_pNext; if (pNow->m_pSibling) { pClone->m_pSibling = pNow->m_pSibling->m_pNext; } pNow = pClone->m_pNext; } } //拆链表,返回新链表 ComplexListNode* ReconnectNodes(ComplexListNode* pHead) { ComplexListNode* pNow = pHead; ComplexListNode* pCloneHead = NULL; ComplexListNode* pClone = NULL; if (pNow) { pCloneHead = pNow->m_pNext; pClone = pNow->m_pNext; pNow->m_pNext = pClone->m_pNext; pNow = pNow->m_pNext; } while (pNow) { pClone->m_pNext = pNow->m_pNext; pClone = pClone->m_pNext; pNow->m_pNext = pClone->m_pNext; pNow = pNow->m_pNext; } return pCloneHead; } ComplexListNode* Clone(ComplexListNode* pHead) { CloneNodes(pHead); CloneSibling(pHead); ComplexListNode* pChead = ReconnectNodes(pHead); return pChead; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/nizhannizhan/article/details/47983455