[劍指Offer]-複雜鏈表的複製

題目描述

請實現函數ComplexListNode Clone(ComplexListNode head),複製一個複雜鏈表。在複雜鏈表中,每個結點除了有一個Next指針指向下一個結點外,還有一個Sibling指向鏈表中的任意結點或者NULL。

解題思路

  • 創建新的節點同時將原來鏈表的信息複製過來,將新結點連接起來
  • 將當前新舊節點存入到同一個map容器裏面K-old,B-copy
  • 遍歷map容器,當前的K的Sibling找到的節點S,那麼當前的V的Sibling一定是S’

在這裏插入圖片描述

算法圖解

在這裏插入圖片描述

參考代碼:
package offer;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * 複雜鏈表的複製
 */
public class Offer35 {
    public static void main(String[] args) {
        ComplexListNode node1 = new ComplexListNode(1);
        ComplexListNode node2 = new ComplexListNode(2);
        ComplexListNode node3 = new ComplexListNode(3);
        ComplexListNode node4 = new ComplexListNode(4);
        ComplexListNode node5 = new ComplexListNode(5);
        node1.pNext = node2;
        node2.pNext = node3;
        node3.pNext = node4;
        node4.pNext = node5;
        node5.pNext = null;
        node1.pSibling = node3;
        node2.pSibling = node5;
        node4.pSibling = node2;
        CloneNodes(node1);
        // CloneNodes2(node1);
    }

    /**
     * 基於On空間複雜度
     */
    static void CloneNodes(ComplexListNode head) {
        ComplexListNode currNode = head;
        ComplexListNode copyNode = null;
        HashMap<ComplexListNode, ComplexListNode> nodesMap = new HashMap<ComplexListNode, ComplexListNode>();
        while (currNode != null) {
            copyNode = new ComplexListNode(currNode.node_value);
            nodesMap.put(currNode, copyNode);
            // System.out.println(currNode.node_value + "-" + copyNode.node_value);
            copyNode.pNext = currNode.pNext;
            currNode = currNode.pNext;
        }
        Set<Map.Entry<ComplexListNode, ComplexListNode>> entries = nodesMap.entrySet();
        for (Map.Entry<ComplexListNode, ComplexListNode> entry : entries) {
            //   System.out.println(entry.getKey().node_value);
            if (entry.getKey().pSibling != null) {
                //  System.out.println(entry.getKey().pSibling.node_value);
                ComplexListNode newSib = nodesMap.get(entry.getKey().pSibling);
                if (newSib != null) {
                    entry.getValue().pSibling = newSib;
                    System.out.println(entry.getValue().node_value + "->" + newSib.node_value);
                }
            }
        }
    }


}
/**
 * 鏈表類
 */
class ComplexListNode {
    int node_value;
    ComplexListNode pNext;
    ComplexListNode pSibling;

    ComplexListNode(int node_value) {
        this.node_value = node_value;
        pNext = null;
        pSibling = null;
    }
}

在這裏插入圖片描述


附錄

該題源碼在我的 ?Github 上面!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章