複雜連結串列的複製

Joy_917發表於2020-12-15

題目:

輸入一個複雜連結串列(每個節點中有節點值,以及兩個指標,一個指向下一個節點,另一個特殊指標random指向一個隨機節點),請對此連結串列進行深拷貝,並返回拷貝後的頭結點。(注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空)

思路1-三步法:

  1. 這道題主要是考察連結串列指標的操作,在理解題意的前提下分為三步
  2. 首先要拷貝簡單連結串列的每個結點至原結點的下一個位置(拷貝值)
  3. 其次要拷貝其中的random指標(拷貝結點的random指標指向原結點random指標的下一個結點),因為就相當於指向了拷貝後的結點
  4. 最後將前兩步生成的長連結串列拆分出拷貝的部分(即按奇偶分割),因為拷貝random指標時依賴第二步的關聯方式,如果直接開闢一個新連結串列,只能做到淺拷貝,是複製不了其中的random指標的

此處貼個圖更形象:
在這裡插入圖片描述

程式碼1:

public class Solution {
    public RandomListNode Clone(RandomListNode pHead) {
        if(pHead == null) {
            return null;
        }
         
        RandomListNode currentNode = pHead;
        //1、複製每個結點,如複製結點A得到A1,將結點A1插到結點A後面;
        while(currentNode != null){
            RandomListNode cloneNode = new RandomListNode(currentNode.label);
            RandomListNode nextNode = currentNode.next;
            currentNode.next = cloneNode;
            cloneNode.next = nextNode;
            currentNode = nextNode;
        }
         
        currentNode = pHead;
        //2、重新遍歷連結串列,複製老結點的隨機指標給新結點,如A1.random = A.random.next;
        while(currentNode != null) {
            currentNode.next.random = currentNode.random==null?null:currentNode.random.next;
            currentNode = currentNode.next.next;
        }
         
        //3、拆分連結串列,將連結串列拆分為原連結串列和複製後的連結串列
        currentNode = pHead;
        RandomListNode pCloneHead = pHead.next;
        while(currentNode != null) {
            RandomListNode cloneNode = currentNode.next;
            currentNode.next = cloneNode.next;
            cloneNode.next = cloneNode.next==null?null:cloneNode.next.next;
            currentNode = currentNode.next;
        }
         
        return pCloneHead;
    }
}

思路2-Hash法:

  1. 直接用map來記錄指標間的聯絡,可以直接找到random指標

程式碼2:

import java.util.HashMap;
public class Solution {
    public RandomListNode Clone(RandomListNode pHead)
    {
        HashMap<RandomListNode, RandomListNode> map = new HashMap<>();
        RandomListNode cur = pHead;
        while (cur != null) {
            map.put(cur, new RandomListNode(cur.label));
            cur = cur.next;
        }
        cur = pHead;
        while (cur != null) {
            map.get(cur).next = map.get(cur.next);
            cur = cur.next;
        }
        RandomListNode resHead = map.get(pHead);
        cur = pHead;
        while (cur != null) {
            map.get(cur).random = map.get(cur.random);
            cur = cur.next;
        }
        return resHead;
    }
}


相關文章