题目:有一个复杂链表,其结点除了有一个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;
}
吐槽下这编辑器,太烂了