题目:请实现函数ComplexListNode* Clone(ComplexListNode* pHead),复杂一个复杂链表。在复杂链表中,每个节点除了有一个Next指针指向下一个节点外,还有一个Sibling指向链表中的任意节点或者NULL。
分析:第一反应是先复制Next,再复制Sibling。但是这种方式需要两次遍历。时间性不是很好。所以利用一个长链表方式解决时间效率。
/* 剑指offer面试题26 */ #include <iostream> #include <cstring> using namespace std; struct ComplexListNode{ string data; ComplexListNode* Next; ComplexListNode* Sibling; }; ComplexListNode* Reconnect(ComplexListNode* head){ ComplexListNode* p = head; ComplexListNode* pClone = p->Next; ComplexListNode* pCloneHead = pClone; while(pClone->Next != NULL){ p->Next = pClone->Next; p = pClone->Next; pClone->Next = p->Next; pClone = p->Next; } return pCloneHead; } void CreateNext(ComplexListNode* head){ ComplexListNode* p = head; while(p != NULL){ ComplexListNode* clone = new ComplexListNode; clone->data = p->data; clone->Next = p->Next; clone->Sibling = NULL; p->Next = clone; p = clone->Next; } } void CreateTwoNext(ComplexListNode* head){ ComplexListNode* p = head; while(p != NULL){ ComplexListNode* pNode = p->Next; if(p->Sibling != NULL){ pNode->Sibling = p->Sibling->Next; } p = pNode->Next; } } ComplexListNode* Create(){ ComplexListNode* pNode1 = new ComplexListNode; pNode1->data = 'A'; ComplexListNode* pNode2 = new ComplexListNode; pNode2->data = 'B'; ComplexListNode* pNode3 = new ComplexListNode; pNode3->data = 'C'; ComplexListNode* pNode4 = new ComplexListNode; pNode4->data = 'D'; ComplexListNode* pNode5 = new ComplexListNode; pNode5->data = 'E'; pNode1->Next = pNode2; pNode2->Next = pNode3; pNode3->Next = pNode4; pNode4->Next = pNode5; pNode5->Next = NULL; pNode1->Sibling = pNode3; pNode2->Sibling = pNode5; pNode4->Sibling = pNode2; return pNode1; } int main(){ ComplexListNode* Head = Create(); CreateNext(Head); CreateTwoNext(Head); ComplexListNode* Clone = Reconnect(Head); while(Clone != NULL){ cout << Clone->data << " "; if(Clone->Sibling != NULL){ cout << "Sibling:" << Clone->Sibling->data << " "; } Clone = Clone->Next; } cout << endl; return 0; }