OJ随机链表的复制题目分析

题目内容:

138. 随机链表的复制 - 力扣(LeetCode)

分析:

这道题目,第一眼感觉非常乱,这是正常的,但是我们经过仔细分析示例明白后,其实也并不是那么难。现在让我们一起来分析分析吧!

1.题目要求的是链表的复制,那么我们得想我们该怎么做,才能很好地进行下去呢?

2.是直接把原链表一个一个地移动过来?这思路果断不对,它还要保持原来的链表不被复制啊.

3.经过观察,我们发现13的random指向7。各种穿插的,所以我们采用

//复制
     struct Node* cur=head;
    while(cur)
    {
      
        
        struct Node* copy=(struct Node*)malloc(sizeof(struct Node));
        copy->val=cur->val;
         struct Node*Next=cur->next;
        cur->next=copy;
        copy->next=Next;
        cur=Next;

    }

复制部分:

先在每个数复制下来,分别放在它的原数字的下一个。即下图:

4.接着你看它原链表的那些数字。7的random指向NULL,13的random指向7.(其他的省略说)。7的next指向13。看到这种规律,我们试想是不是可以把复制的也弄成这样子,就形成了一个独立的复制链表了,对吧?

连线部分:

 //连接线
   cur=head;
    while(cur)
    {
        struct Node* copy=cur->next;
       // struct Node* Next=cur->next->next;
        if(cur->random==NULL)
        {
            copy->random=NULL;
        }
        else
        {
            copy->random=cur->random->next;

        }
        cur=cur->next->next;
        
    }

如下图:

你看复制完了之后,是不是可以直接它复制那部分挪下来,它也是不会破坏原链表的,这是不是就符合题目要求了对吧?

5.完成了这步了之后,到了我们一个一个挪的那部分了。

如下图:

解释上图:

 //复制的挪下来,恢复原链表
    
    
    
    struct Node* copyhead=NULL,*copytail=NULL;
    cur=head; 
    while(cur)
    {
        struct Node* copy=cur->next;
        struct Node* Next=copy->next; 
        //尾插
        if(copyhead==NULL)
        {
            copyhead=copytail=copy;
        }
        else
        {
            copytail->next=copy;
            copytail=copytail->next;
            
        }

挪动部分:

当我们复制完了之后,开始挪新的复制链表:

1.首先定义一个cur指针指向head头。再定义一个next指针指向cur的下一个(方便它随时都能返回找到copy的位置)。

2.定义两个指针分别为copyhead和copytail指针,放在新的链表那里当作移动工具和最后返回工具

2.接着,相当于进行尾插,当 第一次时,copyhead和copytail都为空时,就把copy值直接放到这个指针

3.不为空时,就把copy值放到copytail的下一位。

恢复部分:

最后,恢复原来的链表,即去掉它copy的那些数:

1.因为我们上面都没有动过cur的位置,所以这里就直接使用cur这个指针就行了。

2.把cur的下一个给Next即: 把cur的下一个next给给cur的next的next(即cur的下下个)。

  //恢复链表
            cur->next=Next;
            cur=Next; 

总代码:

/**
 * Definition for a Node.
 * struct Node {
 *     int val;
 *     struct Node *next;
 *     struct Node *random;
 * };
 */

struct Node* copyRandomList(struct Node* head) {
	//复制
     struct Node* cur=head;
    while(cur)
    {
      
        
        struct Node* copy=(struct Node*)malloc(sizeof(struct Node));
        copy->val=cur->val;
         struct Node*Next=cur->next;
        cur->next=copy;
        copy->next=Next;
        cur=Next;

    }
    //连接线
   cur=head;
    while(cur)
    {
        struct Node* copy=cur->next;
       // struct Node* Next=cur->next->next;
        if(cur->random==NULL)
        {
            copy->random=NULL;
        }
        else
        {
            copy->random=cur->random->next;

        }
        cur=cur->next->next;
        
    }
    //复制的挪下来,恢复原链表
    
    
    
    struct Node* copyhead=NULL,*copytail=NULL;
    cur=head; 
    while(cur)
    {
        struct Node* copy=cur->next;
        struct Node* Next=copy->next; 
        //尾插
        if(copyhead==NULL)
        {
            copyhead=copytail=copy;
        }
        else
        {
            copytail->next=copy;
            copytail=copytail->next;
            
        }
        //恢复链表
            cur->next=Next;
            cur=Next; 
    
    }
    return copyhead;
}

最后,特别要注意的是:cur的位置要每到一部分都要及时更新变成head。(因为它每一部分都在改变),不然就会像我一开始那样,发现怎么都不正确哇哇哇哇。

每次鸡汤:

好啦,到了我们的每次鸡汤部分:

虽然我每次迈出的那一步都很小,但是终究会有那么一天会到达终点的。加油吧,青年。

相关推荐
中小企业实战军师刘孙亮26 分钟前
如何制作一份好的年终总结PPT?-中小企实战运营和营销工作室博客
职场和发展·新媒体运营·powerpoint·创业创新·需求分析·学习方法·业界资讯
世事如云有卷舒35 分钟前
《Rust权威指南》学习笔记(二)
笔记·学习·rust
开心的一只小青蛙1 小时前
DCMM数据能力成熟度评估模型--学习笔记(2)
笔记·学习·dcmm·数据管理能力成熟度评估模型
qiu_shi_1 小时前
1.2.1-2部分数据结构的说明02_链表
数据结构
两笼包子一碗馄饨1 小时前
【软考网工笔记】计算机基础理论与安全——网络安全
笔记·安全·web安全
宇寒风暖1 小时前
软件工程大复习(七)面向对象设计
笔记·学习·软件工程·uml
qincjun1 小时前
Qt笔记:网络编程Tcp
网络·笔记·qt
赵谨言2 小时前
基于python大数据的水利数据获取及大数据服务
经验分享·python·毕业设计
swan4163 小时前
SCAU期末笔记 - 数据库系统概念往年试卷解析
数据库·笔记·mysql·数据库系统·数据库系统概念
绍兴贝贝3 小时前
代码随想录算法训练营第五十二天|KM101.孤岛的总面积|KM102.沉没孤岛|KM103.水流问题|KM104.建造最大岛屿
数据结构·人工智能·python·算法·力扣