76 复杂链表的复制

来源:互联网 发布:ubuntu和优麒麟哪个好 编辑:程序博客网 时间:2024/06/05 19:27

76.复杂链表的复制
题目:有一个复杂链表,其结点除了有一个 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) ,以复制一个
复杂链表。


/*76.复杂链表的复制题目:有一个复杂链表,其结点除了有一个 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) ,以复制一个复杂链表。首先复制每一个结点N为N*,不同的是我们将N*让在对应的N后面然后我们要确定每一个N*的sibling分量,非常明显,N的sibling分量的next就是N*的sibling分量。最后,将整个链表拆分成原始链表和拷贝出的链表。*/ struct Node{    int val;    Node* next;    Node* sibling;};//第一步 void Clone(Node* head)// 将N*链表复制到N后面 {    Node* current=head;    while(current)    {        Node* temp=new Node;        temp->val=current->val;        temp->next=current->next;        temp->sibling=NULL;                current->next=temp;//将新复制的结点链接在原始结点的后面         current=temp->next;    }} /*第二步是设置我们复制出来的链表上的结点的m_pSibling。假设原始链表上的N的m_pSibling指向结点S,那么其对应复制出来的N’是N->m_pNext,同样S’也是S->m_pNext。*/ void ConstructSibling(Node* head){    Node* origin=head;    Node* clone;    while(origin)    {        clone=origin->next;//复制的                 if(origin->sibling)//原来的m_pSibling             clone->sibling=origin->sibling->next;        origin=clone->next;    }}/*第三步是把这个长链表拆分成两个:把奇数位置的结点链接起来就是原始链表,把偶数位置的结点链接出来就是复制出来的链表。*/Node* Split(Node* head){    Node *CloneHead,*clone,*origin;    origin=head;    if(origin)    {        CloneHead=origin->next;                origin->next=CloneHead->next;//原来的         origin=CloneHead->next;                clone=CloneHead;    }    while(origin)    {        Node* temp=origin->next;                origin->next=temp->next;//原来的        origin=origin->next;                clone->next=temp;        clone=temp;    }    return CloneHead;}ComplexNode* Clone(ComplexNode* pHead)  { //the whole thingClone(head);ConstructSibling(head);return Split(head);}


0 0
原创粉丝点击