1. 程式人生 > >[leetcode]138. Copy List with Random Pointer復制帶有隨機指針的鏈表

[leetcode]138. Copy List with Random Pointer復制帶有隨機指針的鏈表

leetcode () 一模一樣 spa pos 哈希表 找到 哈希 list

public RandomListNode copyRandomList(RandomListNode head) {
        /*
        深復制,就是不能只是復制原鏈表變量,而是做一個和原來鏈表一模一樣的新鏈表,
        每一個節點都是新建的,而不是指向就節點
        這個題的難點在於:隨機節點。
        隨機節點有可能指向後邊還沒有建立的節點,這就沒法指。
        方法一:一一對應地記錄每個新舊節點的映射關系,在常規節點建立後,就去查哈希表,找到對應
        新節點的舊節點的random,就是新節點的random
         
*/ if (head==null) return null; Map<RandomListNode,RandomListNode> map = new HashMap<>(); //新節點 RandomListNode n = new RandomListNode(head.label); //記住:二叉樹、鏈表這種前後有關聯的數據結構,要叠代(註意是叠代方式)遍歷的時候,一定要建立一個結構代表當前節點,往下遍歷(遞歸看情況) RandomListNode curN=n,curO=head; map.put(curO,curN);
//先復制常規節點 while (curO.next!=null) { //復制節點 curN.next = new RandomListNode(curO.next.label); curN = curN.next; curO = curO.next; //建立映射 map.put(curO,curN); } //復制random之前先初始化兩個cur curN = n; curO
= head; while (curN!=null) { if (curO.random!=null) { //通過映射找到random curN.random = map.get(curO.random); } curN = curN.next; curO = curO.next; } return n; }

[leetcode]138. Copy List with Random Pointer復制帶有隨機指針的鏈表