Leetcode-每日一题【剑指 Offer 35. 复杂链表的复制】

这篇具有很好参考价值的文章主要介绍了Leetcode-每日一题【剑指 Offer 35. 复杂链表的复制】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目

请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null

示例 1:

Leetcode-每日一题【剑指 Offer 35. 复杂链表的复制】,leetcode,算法,职场和发展,java,数据结构

输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]

示例 2:

Leetcode-每日一题【剑指 Offer 35. 复杂链表的复制】,leetcode,算法,职场和发展,java,数据结构

输入:head = [[1,1],[2,1]]
输出:[[1,1],[2,1]]

示例 3:

Leetcode-每日一题【剑指 Offer 35. 复杂链表的复制】,leetcode,算法,职场和发展,java,数据结构

输入:head = [[3,null],[3,0],[3,null]]
输出:[[3,null],[3,0],[3,null]]

示例 4:

输入:head = []
输出:[]
解释:给定的链表为空(空指针),因此返回 null。

提示:

  • -10000 <= Node.val <= 10000
  • Node.random 为空(null)或指向链表中的节点。
  • 节点数目不超过 1000 。

解题思路

1.题目要求我们复制一个复杂链表。在这个复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。我们可以用Map来实现,详情请查看【138.复制带随机指针的链表】,我们今天用另一种方法去实现。

2.举个例子大家更容易理解

Leetcode-每日一题【剑指 Offer 35. 复杂链表的复制】,leetcode,算法,职场和发展,java,数据结构

假如所给链表如上图所示,首先我们要做的就是设置一个 cur 节点去遍历链表,在遍历的同时将所有的节点复制一份,复制出来的每个节点都跟在原来节点的后面。如下图所示。

Leetcode-每日一题【剑指 Offer 35. 复杂链表的复制】,leetcode,算法,职场和发展,java,数据结构 节点复制完后我们会发现,复制出来的节点random指针都为空,那么我们要做的就是要读取出原节点的random指针的值,并且将它的后一个节点赋给复制出来的新节点的random(之所以是后一个节点是因为,后一个节点才是我们的复制品)。

Leetcode-每日一题【剑指 Offer 35. 复杂链表的复制】,leetcode,算法,职场和发展,java,数据结构

最后我们要做的工作就是将两个链表拆分开来,也就是让 3 的 next 不再指向 3‘ 而是指向 5,让 3’ 的 next 重新指向 5‘,最后拆分完的结果如下图所示。

Leetcode-每日一题【剑指 Offer 35. 复杂链表的复制】,leetcode,算法,职场和发展,java,数据结构 这样我们就得到了原链表的复印件,我们在复制链表和拆分链表的时候要注意空指针 ,所以需要判断一下。

代码实现

class Solution {
    public Node copyRandomList(Node head) {
        if(head == null){
            return null;
        }
        //复制链表的节点
        Node cur = head;
        while(cur != null){
            Node next = cur.next;
            cur.next = new Node(cur.val);
            cur.next.next = next; 
            cur = next;
        }
        //复制随机节点
        cur = head;
        while(cur != null){
            Node nextNode = cur.next;
            nextNode.random = cur.random == null ? null : cur.random.next;
            cur = cur.next.next;

        }
        //拆分链表
        Node newHead = head.next;
        cur = head;
        Node curHead = head.next;
        while(cur != null){
            cur.next = cur.next.next;
            cur = cur.next;
            curHead.next = cur == null ? null : cur.next;
            curHead = curHead.next;
        
        }
        return newHead;
    }
}

测试结果

Leetcode-每日一题【剑指 Offer 35. 复杂链表的复制】,leetcode,算法,职场和发展,java,数据结构

 文章来源地址https://www.toymoban.com/news/detail-671033.html

到了这里,关于Leetcode-每日一题【剑指 Offer 35. 复杂链表的复制】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Leetcode-每日一题【剑指 Offer 06. 从尾到头打印链表】

    输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。 示例 1: 输入: head = [1,3,2] 输出: [2,3,1] 限制: 0 = 链表长度 = 10000 1.题目要求我们从尾到头反过来返回每个节点的值,这道题我们可以用栈去解决,但是我们还可以采用另一种方法。就是我们可以

    2024年02月13日
    浏览(28)
  • 每日一题——复杂链表的复制

    题目链接 如果不考虑 random 指针的复制,仅仅复制单链表的结构还是简单的。只需要通过一个指针 cur 遍历原链表,再不断创建新节点尾插到 newHead 后即可。 但如果要考虑 random 指针的复制,那过程就复杂了。 有小伙伴会这样想:既然原链表和复制的链表的结构一致,那么对

    2024年02月14日
    浏览(17)
  • Leetcode-每日一题【剑指 Offer 29. 顺时针打印矩阵】

    输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。 示例 1: 输入: matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出: [1,2,3,6,9,8,7,4,5] 示例 2: 输入: matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]] 输出: [1,2,3,4,8,12,11,10,9,5,6,7] 限制: 0 = matrix.length = 100 0 = matrix[i].length = 100 1.题目要求

    2024年02月13日
    浏览(47)
  • Leetcode-每日一题【剑指 Offer 16. 数值的整数次方】

    实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。不得使用库函数,同时不需要考虑大数问题。 示例 1: 输入: x = 2.00000, n = 10 输出: 1024.00000 示例 2: 输入: x = 2.10000, n = 3 输出: 9.26100 示例 3: 输入: x = 2.00000, n = -2 输出: 0.25000 解释: 2-2 = 1/22 = 1/4 = 0.25 提示: -10

    2024年02月13日
    浏览(28)
  • (字符串 ) 剑指 Offer 05. 替换空格 ——【Leetcode每日一题】

    难度:简单 请实现一个函数,把字符串 s 中的每个 空格 替换成 “ %20 ”。 示例 1: 输入:s = “We are happy.” 输出:“We%20are%20happy.” 限制 : 0 = s 的长度 = 10000 💡思路:双指针法 如果想把这道题目做到 极致 ,就不要只用额外的辅助空间了! 首先扩充数组到每个空格替换

    2024年02月08日
    浏览(33)
  • Leetcode-每日一题【剑指 Offer 11. 旋转数组的最小数字】

    把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一次旋转,该数组的

    2024年02月14日
    浏览(31)
  • Leetcode-每日一题【剑指 Offer 26. 树的子结构】

    输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构) B是A的子结构, 即 A中有出现和B相同的结构和节点值。 例如: 给定的树 A:      3     /    4   5   /  1   2 给定的树 B:    4    /  1 返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点

    2024年02月13日
    浏览(47)
  • Leetcode-每日一题【剑指 Offer 27. 二叉树的镜像】

    请完成一个函数,输入一个二叉树,该函数输出它的镜像。 例如输入:      4    /     2     7  /   / 1   3 6   9 镜像输出:      4    /     7     2  /   / 9   6 3   1 示例 1: 输入: root = [4,2,7,1,3,6,9] 输出: [4,7,2,9,6,3,1] 限制: 0 = 节点个数 = 1000 1.题目要求我们设

    2024年02月13日
    浏览(31)
  • (树) 剑指 Offer 26. 树的子结构 ——【Leetcode每日一题】

    难度:中等 输入两棵二叉树 A 和 B ,判断 B 是不是 A 的子结构。(约定空树不是任意一个树的子结构) B 是 A 的子结构, 即 A 中有出现和B相同的结构和节点值。 例如: 给定的树 A : 给定的树 B : 返回 true ,因为 B 与 A 的一个子树拥有相同的结构和节点值。 示例 1: 输入:A =

    2024年02月15日
    浏览(38)
  • (搜索) 剑指 Offer 12. 矩阵中的路径 ——【Leetcode每日一题】

    难度:中等 给定一个 m * n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许

    2024年02月12日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包