題目描述
請實現函數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 上面!