Leetcode面试经典150题-138.随机链表的复制

题目比较简单,重点是理解思想,random不管,copy一定要放在next

而且里面的遍历过程不能省略

解法都在代码里,不懂就留言或者私信

java 复制代码
/*
// Definition for a Node.
class Node {
    int val;
    Node next;
    Node random;

    public Node(int val) {
        this.val = val;
        this.next = null;
        this.random = null;
    }
}
*/

class Solution {
    /**基本思路:1.遍历链表,每个节点拷贝一个节点放到它的next位置,然后它的copy的下一个放它原来的next
    2.把copy的random指针指向原始节点random指针的下一个(因为下一个是random的copy)
    3.拆分链表,把新的链表拷贝出来*/
    public Node copyRandomList(Node head) {
        if(head == null) {
            return null;
        }
        /**遍历链表复制节点并连接 */
        Node cur = head;
        while(cur != null) {
            Node next = cur.next;
            Node curCopy = new Node(cur.val);
            cur.next = curCopy;
            curCopy.next = next;
            cur = next;
        }
        /**设置新节点的random指针*/
        cur = head;
        while(cur != null) {
            /**这里因为存在复制节点并且复制节点肯定放在原始节点的下一个,所以
            cur.next肯定不为空,所以这里不会有空指针的问题*/
            Node next = cur.next.next;
            cur.next.random = cur.random == null? null : cur.random.next;
            cur = next;
        }
        /**断开链接,分离出拷贝链表,这里先把拷贝链表头节点拿出来*/
        Node newHead = head.next;
        /**还是通过从原来的头开始遍历,因为原链表要改next指针 */
        cur = head;
        while(cur != null) {
            /**拿到原来链表中的next,这个next可能为空 */
            Node next = cur.next.next;
            /**这里有可能next是null,要判断,不然会有空指针 */
            cur.next.next = next == null? null : next.next;
            /**指向原来的next */
            cur.next = next;
            /**指针挪到下个节点继续 */
            cur = next;
        }
        return newHead;
        
    }
}
相关推荐
倒头就睡的小比特16 小时前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!16 小时前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
晨米酱17 小时前
AGENTS.md:Agent 的上下文策略层
面试·架构·agent
猎头南楼17 小时前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
旖旎夜光18 小时前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark18 小时前
大规模并行计算中的负载均衡算法研究4
算法
Because_of_Her118 小时前
并查集-听课笔记
笔记·算法·并查集
码流子18 小时前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构
彧azz19 小时前
Linux 环境下 Redis 学习总结:数据类型、持久化、锁、事务、主从与缓存问题
linux·redis·笔记·学习·面试
another heaven19 小时前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法