【LeetCode】剑指 Offer(18)

目录

题目:剑指 Offer 35. 复杂链表的复制 - 力扣(Leetcode)

题目的接口:

解题思路:

代码:

过啦!!!

写在最后:


题目:剑指 Offer 35. 复杂链表的复制 - 力扣(Leetcode)

【LeetCode】剑指 Offer(18)_第1张图片

题目的接口:

/*
// Definition for a Node.
class Node {
public:
    int val;
    Node* next;
    Node* random;
    
    Node(int _val) {
        val = _val;
        next = NULL;
        random = NULL;
    }
};
*/
class Solution {
public:
    Node* copyRandomList(Node* head) {

    }
};

解题思路:

一开始先判断一下链表是否为空,

如果为空,直接返回空就行。

接下来是思路:

【LeetCode】剑指 Offer(18)_第2张图片

我的思路是通过原链表再复制一个链表:

【LeetCode】剑指 Offer(18)_第3张图片

 所以我们的第一步就是循环创建一个链表,

【LeetCode】剑指 Offer(18)_第4张图片

接在原链表上,如上图,

然后,

第二步是将原链表的random指针同样复制到新的链表上,

(改random的图我懒得画了,如果感兴趣可以自己画一画)

最后一步就是将新的链表独立出来,

再让原链表恢复,如下图:

【LeetCode】剑指 Offer(18)_第5张图片

 最后再返回新的链表的头结点即可。

代码如下:

代码:

/*
// Definition for a Node.
class Node {
public:
    int val;
    Node* next;
    Node* random;
    
    Node(int _val) {
        val = _val;
        next = NULL;
        random = NULL;
    }
};
*/
class Solution {
public:
    Node* copyRandomList(Node* head) {
        //判断链表是否为空
        if(!head)
        {
            return nullptr;
        }

        //复制原链表
        Node* cur = head;
        while(cur)
        {
            //new一个新节点,并初始化val
            Node* copy = new Node(cur->val);
            copy->next = cur->next;
            cur->next = copy;
            cur = copy->next;
        }

        //复制原链表的指针
        cur = head;
        while(cur)
        {
            //如果randam是指向空指针就不用管(因为原本就是空)
            if(cur->random)
            {
                cur->next->random = cur->random->next;
            }
            cur = cur->next->next;
        }

        //将原链表还原,将新链表独立出来
        Node* newhead = head->next;
        Node* prev = head;
        cur = newhead;
        while(cur->next)
        {
            //还原原链表
            prev->next = prev->next->next;
            prev = prev->next;

            //独立新链表
            cur->next = cur->next->next;
            cur = cur->next;
        }

        //新链表的尾
        prev->next = nullptr;

        //返回新链表的头
        return newhead;
    }
};

过啦!!!

【LeetCode】剑指 Offer(18)_第6张图片

写在最后:

以上就是本篇文章的内容了,感谢你的阅读。

如果喜欢本文的话,欢迎点赞和评论,写下你的见解。

如果想和我一起学习编程,不妨点个关注,我们一起学习,一同成长。

之后我还会输出更多高质量内容,欢迎收看。

你可能感兴趣的:(刷题训练,leetcode,算法,c++,学习)