76.复杂链表的复制

来源:互联网 发布:类似知乎的网站源码 编辑:程序博客网 时间:2024/06/15 20:39

题目:有一个复杂链表,其结点除了有一个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),以复制一个复杂链表。
分析:在常见的数据结构上稍加变化,这是一种很新颖的面试题。要在不到一个小时的时间里解决这种类型的题目,我们需要较快的反应能力,对数据结构透彻的理解以及扎实的编程功底。



HANDWRITING:

想着第一次遍历构造链表结构,第二次遍历调整m_pSilbling指针,发现调整m_pSibling指针时查找的复杂度很高,改变思路。

如果将创建的节点紧接着放在原来节点的next,那么查找m_pSibling也只用找原节点m_pSibling的next,有了思路开写。

ComplexNode *Clone(ComplexNode *pHead) {ComplexNode *cur = pHead, *nHead, *ncur;while (cur != 0) {ComplexNode *tmp = new ComplexNode();tmp->m_nValue = cur->m_nValue;tmp->m_pNext = cur->m_pNext;cur->m_pNext = tmp;cur = tmp->m_pNext;}nHead = pHead->m_pNext;cur = pHead, ncur = nHead;while (cur != 0) {ncur->m_pSibling = cur->m_pSibling->m_pNext;cur = ncur->m_pNext;ncur = cur->m_pNext;}cur = pHead, ncur = nHead;while (cur != 0) {cur->m_pNext = cur->m_pNext->m_pNext;ncur->m_pNext = ncur->m_pNext->m_pNext;cur = cur->m_pNext;ncur = ncur->m_pNext;}return nHead;}

吐槽下这编辑器,太烂了

原创粉丝点击