剑指offer 面试题26 复杂链表的复制
2016-07-04 07:54
656 查看
// 剑指offer 面试题26 复杂链表的复制 #include <iostream> using namespace std; struct ComplexListNode { int m_nValue; ComplexListNode* m_pNext; ComplexListNode* m_pSibling; ComplexListNode(){m_nValue = 0; m_pNext = NULL; m_pSibling = NULL;} ComplexListNode(int value){m_nValue = value; m_pNext = NULL; m_pSibling = NULL;} }; /*不借助辅助空间的情况下实现O(n)的时间效率*/ // 第一步,根据原始链表的每个节点N,复制出N',把N'链接在对应的N后面 void CloneNodes(ComplexListNode* pHead) { ComplexListNode* pNode = pHead; while(pNode) { ComplexListNode* pCloned = new ComplexListNode(); pCloned->m_nValue = pNode->m_nValue; // 先保存原来的N节点的next指针 pCloned->m_pNext = pNode->m_pNext; // 不复制sibling指针 pCloned->m_pSibling = NULL; pNode->m_pNext = pCloned; pNode = pCloned->m_pNext; } } // 第二步,设置复制出来的节点的sibling指针 // 若原始链表上的N的sibling指针指向S,则复制出来的N指向S的next指向的节点S' void ConnectSiblingNodes(ComplexListNode* pHead) { ComplexListNode* pNode = pHead; while(pNode) { ComplexListNode* pCloned = pNode->m_pNext; if(pNode->m_pSibling) { pCloned->m_pSibling = pNode->m_pSibling->m_pNext; } pNode = pCloned->m_pNext; } } // 第3步,拆分链表,奇数位置的节点用next连接起来就是原始链表 // 偶数位置的节点用next链接起来就是复制出来的链表。 ComplexListNode* ReconnectNodes(ComplexListNode* pHead) { // 用于返回 ComplexListNode* pClonedHead = NULL; ComplexListNode* pNode = pHead; ComplexListNode* pClonedNode = NULL; if(pNode) { // 找到复制的链表头,更新当前复制链表节点 pClonedHead = pClonedNode = pNode->m_pNext; // 重连原始链表,更新当前原始链表节点 pNode->m_pNext = pClonedNode->m_pNext; pNode = pNode->m_pNext; } while(pNode) { pClonedNode->m_pNext = pNode->m_pNext; pClonedNode = pClonedNode->m_pNext; pNode->m_pNext = pClonedNode->m_pNext; pNode = pNode->m_pNext; } return pClonedHead; } ComplexListNode* clone(ComplexListNode* pHead) { CloneNodes(pHead); ConnectSiblingNodes(pHead); return ReconnectNodes(pHead); } int main() { ComplexListNode* p1 = new ComplexListNode(1); ComplexListNode* p2 = new ComplexListNode(2); ComplexListNode* p3 = new ComplexListNode(3); ComplexListNode* p4 = new ComplexListNode(4); ComplexListNode* p5 = new ComplexListNode(5); p1->m_pSibling = p3; p2->m_pSibling = p5; p4->m_pSibling = p2; p1->m_pNext = p2; p2->m_pNext = p3; p3->m_pNext = p4; p4->m_pNext = p5; ComplexListNode* pClonedList = clone(p1); return 0; }
相关文章推荐
- 面试题3:二维数组中的查找
- 面试题四:替换空格
- 剑指offer第一题
- 剑指Offer 面试题3:二维数组中查找
- 从尾到头打印链表
- 二叉树两个结点的最低公共祖先
- 根据后序和中序遍历重建二叉树
- 根据先序和中序遍历重建二叉树
- 根据先序和中序遍历重建二叉树
- 根据后序和中序遍历重建二叉树
- 二叉树两个结点的最低公共祖先
- 《剑指Offer》面试题1:赋值运算符函数
- 剑指offer第三题:二维数组中查找
- 剑指offer 重建二叉树 java实现
- 剑指offer 替换空格 java实现
- 九度 Online Judge 之《剑指 Offer》一书相关题目解答
- 剑指offer 二维数组中的查找
- 剑指offer 调整数组顺序使奇数位于偶数前面
- 【练习笔记】剑指offer-面试题8 :旋转数组的最小数字
- 【练习笔记】剑指offer-变态跳台阶