復雜鏈表的復制(Hard)
阿新 • • 發佈:2019-04-11
分析 public lee ger while 表頭 圖片 node 問題分析 問題來源:選自LeetCode 138:復制帶隨機指針的鏈表
問題來源:選自LeetCode 138:復制帶隨機指針的鏈表
問題描述:
題目給定信息:
該鏈表中每一個節點的成員變量都有兩個,一個是next指針指向該節點的下一個節點,一個是random指針指向不確定,可以指向該鏈表中任意一個節點,也可以指向它自己,還可以指向為空,我們要克隆這個鏈表,並且保證每一個鏈表節點的兩個指針都和原鏈表是一樣的。
問題分析:
我們可以間接的利用節點地址和節點序號之間的映射關系,在Map集合中存貯兩個鏈表(原鏈表和新建待克隆鏈表)的映射關系。通過一個while循環,創建出和每個鏈表節點值相同的節點,並且把這些節點都按照映射關系存進Map集合中,在這個循環中還能把新創建的節點的next指針賦上相應的值。然後再經過一個while循環,每遍歷到原鏈表的一個節點,我們就在Map集合中找到該節點映射對應的新創建節點是哪一個,這樣就能給新創建的節點的random指針進行賦值操作,便利循環結束,新創建的每一個節點的random指針也全部賦值結束。返回新創建的鏈表頭指針就可以了。
函數實現:
方法一:
1 public Node copyRandomList(Node head) { 2 if (head == null) { 3 return null; 4 } 5 Node newHead = new Node(head.val, null, null); 6 Node temp = head.next; 7 Node temp_New = newHead; 8 Map<Node, Node> map = newHashMap<>(); 9 map.put(head, newHead); 10 while (temp != null) { 11 Node newList = new Node(temp.val, null, null); 12 map.put(temp, newList); 13 temp_New.next = newList; 14 temp_New = newList; 15 temp = temp.next;16 } 17 temp = head; 18 temp_New = newHead; 19 while (temp != null) { 20 temp_New.random = map.get(temp.random); 21 temp = temp.next; 22 temp_New = temp_New.next; 23 } 24 return newHead; 25 }
方法二:
1 public Node copyRandomList(Node head) { 2 Map<Node, Integer> map = new HashMap<Node, Integer>(); 3 Vector<Node> vector = new Vector<Node>(); 4 Node node = head; 5 int i = 0; 6 while (node != null) { 7 vector.add(new Node(node.val, null, null)); 8 map.put(node, i); 9 node = node.next; 10 i++; 11 } 12 node=head; 13 i=0; 14 while(node!=null){ 15 vector.get(i).next=vector.get(i+1); 16 if(node.random!=null){ 17 int id=map.get(node); 18 vector.get(i).random=vector.get(id); 19 } 20 node=node.next; 21 i++; 22 } 23 return vector.get(0); 24 }
運行結果:
復雜鏈表的復制(Hard)