zoukankan      html  css  js  c++  java
  • 复杂链表的复制

    题目:有一个复杂链表,其结点除了有一个m_pNext指针指向下一个结点外,

    还有一个m_pSibling指向链表中的任一结点或者NULL。其结点的C++定义如下:
     struct ComplexNode
    {
        int value;
        ComplexNode* pNext;
        ComplexNode* pSibling;
    };                       

    请完成函数ComplexNode* Clone(ComplexNode* pHead),以复制一个复杂链表。


    思路: 一般复制一个简单链表就这么遍历一遍就好了,这个复杂链表,比简单链表多的地方就在于多了一个sibling的指针,也就是说在建立完简单链表之后,如何在新的链表中找到sibling对应的地址。我们已知的是旧的节点的地址,所以只需要用一个map,保存每一个节点旧的节点对应的新的节点的地址即可。

    第一次遍历,建立简单节点,第二次遍历,对于旧链表中的每一个节点的sibling指针地址,从map中找到新链表中对应节点的地址,连接上就好了。

    代码如下:

    #include "stdafx.h"
    #include <iostream>
    #include <map>
    using namespace std;
    
     struct ComplexNode
    {
        int value;
        ComplexNode* pNext;
        ComplexNode* pSibling;
    };      
    
     ComplexNode* Clone(ComplexNode* pHead)
     {
        if(pHead == NULL)  return NULL;
         map<ComplexNode*, ComplexNode*> pointMap;
         // newHead指向复制的新链表的开头,tail始终指向结尾
         ComplexNode* newHead,*tail;
         // 开辟一个头结点
         newHead = new ComplexNode;
         newHead->value = pHead->value;
         newHead->pNext = NULL;
         newHead->pSibling = NULL;
         // 将头结点放入map中
         pointMap[pHead] = newHead;
    
         tail = newHead;
         ComplexNode *p = pHead->pNext;
         // 第一遍先将简单链表复制一下
         while(p != NULL)
         {
            ComplexNode* newNode = new ComplexNode;
            newNode->value = p->value;
            newNode->pNext = NULL;
            newNode->pSibling = NULL;
    
            tail->pNext = newNode;
            tail = newNode;
            pointMap[p] = newNode;
             p = p->pNext;
         }
    
         // 根据map中保存的数据,找到对应的节点
         p = pHead;
         tail = newHead;
         while(p!=NULL)
         {
             if(p->pSibling!=NULL)
             {
                 tail->pSibling = pointMap.find(p->pSibling)->second;
             }
             p = p->pNext;
             tail  = tail->pNext;
         }
        return newHead;
     }
    
     void deleteList(ComplexNode* pHead)
     {
        while(pHead!=NULL)
        {
            ComplexNode* pNext = pHead->pNext;
            delete pHead;
            pHead = pNext;
        }
     
     }
    
    int main()
    {
        ComplexNode* p1 = new ComplexNode;
        ComplexNode* p2 = new ComplexNode;
        ComplexNode* p3 = new ComplexNode;
        ComplexNode* p4 = new ComplexNode;
        p1->pNext = p2; p2->pNext = p3; 
        p3->pNext = p4; p4->pNext = NULL;
        p1->value = 1 ; p2->value = 2;
        p3->value = 3 ; p4->value = 4;
        p1->pSibling = p3;p2->pSibling = p4;
        p3->pSibling = NULL; p4->pSibling = NULL;
    
        ComplexNode* newHead = Clone(p1);
    
        deleteList(newHead);
        deleteList(p1);
    
    }

    结果,我用断点看了一下,是正确的。

  • 相关阅读:
    Go 场景
    sourcetree clone 提示url无效
    简单去重比较/复杂数据去重处理
    vue组件之间的通信
    js-执行机制之同步、异步、宏任务、微任务
    react生命周期
    git push被忽略的文件 处理
    请求头的属性
    运算精度问题https://blog.csdn.net/smile_ping/article/details/80284969
    react中状态提升
  • 原文地址:https://www.cnblogs.com/cyttina/p/2743290.html
Copyright © 2011-2022 走看看