[剑指Offer]-复杂链表的复制
题目描述请实现函数ComplexListNode Clone(ComplexListNode head),复制一个复杂链表。在复杂链表中,每个结点除了有一个Next指针指向下一个结点外,还有一个Sibling指向链表中的任意结点或者NULL。解题思路创建新的节点同时将原来链表的信息复制过来,将新结点连接起来将当前新旧节点存入到同一个map容器里面K-old,B-copy遍历map容器,...
·
题目描述
请实现函数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 上面!
更多推荐
已为社区贡献2条内容
所有评论(0)