A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null.
Return a deep copy of the list.
和第133题差不多,都是图的复制,区别在于这道题的label有可能是相同的,所以导致了map的key有可能相同,所以需要处理。
两种方法差不多。第二种更简洁。
1、在复制next之后修改原结构的label为顺序增长,方便建立map,之后再修改回来。
/** * Definition for singly-linked list with a random pointer. * class RandomListNode { * int label; * RandomListNode next, random; * RandomListNode(int x) { this.label = x; } * }; */ public class Solution { public RandomListNode copyRandomList(RandomListNode head) { if( head == null ) return null; Map map2 = new HashMap<Integer,RandomListNode>(); int num = 1; RandomListNode node = head; RandomListNode newNode = new RandomListNode(head.label); RandomListNode node2 = newNode; map2.put(0,node2); node.label = 0; node = node.next; while( node != null ){ RandomListNode nextNode = new RandomListNode(node.label); node2.next = nextNode; node2 = node2.next; node.label = num; map2.put(num,node2); num++; node = node.next; } node = head; node2 = newNode; while( node != null ){ if( node.random == null){ node = node.next; node2 = node2.next; continue; } node2.random = (RandomListNode) map2.get( node.random.label ); node = node.next; node2 = node2.next; } node2 = newNode; node = head; while( node != null ){ node.label = node2.label; node = node.next; node2 = node2.next; } return newNode; } }
2、建立map的时候使用
Map<RandomListNode,RandomListNode>
/** * Definition for singly-linked list with a random pointer. * class RandomListNode { * int label; * RandomListNode next, random; * RandomListNode(int x) { this.label = x; } * }; */ public class Solution { public RandomListNode copyRandomList(RandomListNode head) { if( head == null ) return null; Map<RandomListNode,RandomListNode> map = new HashMap<RandomListNode,RandomListNode>(); RandomListNode node = head; while( node != null ){ map.put(node,new RandomListNode(node.label)); 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); } }