zoukankan      html  css  js  c++  java
  • 【剑指offer】面试题26:复杂链表的复制

    题目:

    输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点)。

    思路:

    复制自身到下一个结点;

    设置新结点的random指针;

    分离链表。

    注意:判断输入参数,只需要判断是不是空指针就行了。(之前判断当只有一个结点时直接返回。。。那全部直接返回输入参数就是了~~~)

    代码:

    /*
    struct RandomListNode {
        int label;
        struct RandomListNode *next, *random;
        RandomListNode(int x) :
                label(x), next(NULL), random(NULL) {
        }
    };
    */
    class Solution {
    public:
        RandomListNode* Clone(RandomListNode* pHead)
        {
            //if(pHead==NULL || pHead->next==NULL)  return pHead;  当有一个结点的时候,不能直接返回啊,要复制~~
            if(pHead==NULL)  return NULL;
            
            copy(pHead);
            setNewNodeRandom(pHead);
            RandomListNode *res=splice(pHead);
            
            return res;
        }
    private:
        void copy(RandomListNode *pHead)
        {
            while(pHead!=NULL)
            {
                RandomListNode *newnode=new RandomListNode(pHead->label);
                newnode->next=pHead->next;
                //newnode->random=pHead->random; 新结点的random指针应先不设置
                RandomListNode *nextp=pHead->next;//原来的next结点
                pHead->next=newnode;//指向新结点
                pHead=nextp;
            }
        }
        
        void setNewNodeRandom(RandomListNode *pHead)
        {
            while(pHead!=NULL)
            {
                RandomListNode *nextp=pHead->next;
                nextp->random=pHead->random;
                pHead=nextp->next;
            }
        }
        
        RandomListNode* splice(RandomListNode *pHead)
        {
            RandomListNode *newHead=pHead->next;
            RandomListNode *head=newHead;
            while(newHead->next!=NULL)
            {
                pHead->next=newHead->next;
                pHead=newHead->next;
                
                newHead->next=pHead->next;
                newHead=pHead->next;
            }
            pHead->next=NULL;
            
            return head;
        }
    };
  • 相关阅读:
    博士考试复习过程总结
    制作在Linux、Unix上以daemon方式启动Apusic的详细步骤(转)
    重开Blog
    给计算机的兄弟姐妹们补补身体→煲银耳粥
    被人夸成像设计师,高兴呐
    今天问题总结(Hibernate配置参数访问Oracle,Linux下的Apusic自启动)
    HDU ACM 1272 小希的迷宫
    Uva 10115 Automatic Editing
    HDU ACM 1162 Eddy's picture(MST)
    Uva 10474 Where is the Marble?(水题)
  • 原文地址:https://www.cnblogs.com/buxizhizhou/p/4706130.html
Copyright © 2011-2022 走看看