1. 程式人生 > >復雜鏈表的復制(Hard)

復雜鏈表的復制(Hard)

分析 public lee ger while 表頭 圖片 node 問題分析

問題來源:選自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 = new
HashMap<>(); 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)