题目描述

请实现函数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 上面!

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐