复制带随机指针的链表

简介: 复制带随机指针的链表

image.png


本题目一共有两种解决方法,一种是使用HashMap存储键值对,另一种方法是原地复制;

解法一:使用HashMap存储键值对


/*
// 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;
    }
}
*/
//第一种方法使用HashMap方法方法
class Solution {
    public Node copyRandomList(Node head) {
        if(head==null){
            return null;
        }
        //将节点复制到到键值对中
        Node node=head;
        Map<Node,Node> map=new HashMap<>(); 
        while(node!=null){
            Node clone=new Node(node.val);
            map.put(node,clone);
            node=node.next;
        }
        node=head;
        //复制随机域
        while(node!=null){
            map.get(node).next=map.get(node.next); //随机立减
            map.get(node).random=map.get(node.random);
            node=node.next;
        }
        return map.get(head);
    }
}


解法二:原地复制


class Solution {
    public Node copyRandomList(Node head) {
        if(head==null){
            return null;
        }
        //原地复制节点
        Node current=head;
        while(current!=null){
            Node clone=new Node(current.val);
            Node temp= current.next;
            clone.next=current.next;
            current.next=clone;
            current=temp;
        }
        //处理随机节点,要注意画图和校验
        current=head;
        while(current!=null){
            if(current.random!=null){
                 current.next.random=current.random.next;
            }
            current=current.next.next;
        }
        ///将两个链表拆开
        Node newHead=new Node(-1);
        newHead=head.next;
        current=head;
        while(current.next!=null){
         Node temp=current.next;
         current.next=current.next.next;
         current=temp;
        }
        return newHead;
    }
}
目录
相关文章
|
1月前
|
存储 C语言
用指针处理链表
用指针处理链表
27 3
|
12天前
|
算法
【经典LeetCode算法题目专栏分类】【第7期】快慢指针与链表
【经典LeetCode算法题目专栏分类】【第7期】快慢指针与链表
|
1月前
|
存储 C语言
链表—初始化指针变和创建新的节点------区别应用分析
链表—初始化指针变和创建新的节点------区别应用分析
|
1月前
|
存储 缓存 搜索推荐
指针链表
指针链表
13 0
|
1月前
教你三指针拿捏链表翻转
教你三指针拿捏链表翻转
|
1月前
|
算法 C语言 索引
环形链表(快慢指针)
环形链表(快慢指针)
|
1月前
数据结构--链表刷题(一)快慢指针(下)
数据结构--链表刷题(一)快慢指针
20 0
|
1月前
数据结构--链表刷题(一)快慢指针(上)
数据结构--链表刷题(一)快慢指针
23 0
|
1月前
|
存储 编译器 C语言
【数据结构】深入浅出理解链表中二级指针的应用
【数据结构】深入浅出理解链表中二级指针的应用
42 0
|
15天前
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表