本题目一共有两种解决方法,一种是使用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; } }