【剑指offer】面试题35:复杂链表的复制(Java 实现)

请实现函数ComplexListNode* Clone(ComplexListNode * pHead),复制一个复杂链表。在复杂链表中,每个结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任意结点或者NULL。结点的C++定义如下:

struct ComplexListNode{
    int m_nValue;
    ComplexListNode* m_pNext;
    ComplexListNode* m_pSibling;
};

上图是一个含有5个结点的复杂链表。图中实线箭头表示m_pNext指针,虚线箭头表示m_pSibling指针。为了简单起见,指向NULL的指针没有画出。
思路:

第一步制原始链表上的每个结点N创建N',然后把这些创建出来的结点用m_pNext链接起来。同时我们把<N, N'>的配对信息放到一个哈希表中。第二步还是设置复制链表上的每个结点的m_pSibling。如果在原始链表中结点N的m_pSibling指向结点S,那么在复制链表中,对应的N'应该指向S'。由于有了哈希表,我们可以在O(1)的时间根据S找到S’。这种是以O(n)的空间换来了O(n)的时间复杂度。
 

代码:

package offer;

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

class ComplexList
{
    char val;
    ComplexList next = null;
    ComplexList extend = null;
    ComplexList(char val)
    {
        this.val = val;
    }
}
public class ti35 {
    static ComplexList CloneComplexList(ComplexList head)
    {
        Map<ComplexList,ComplexList> map = new HashMap<ComplexList,ComplexList>();
        ComplexList CloneNode = new ComplexList('a');
        if(head!=null)
        {
            CloneNode = head;
            map.put(head,CloneNode);
        }
        ComplexList CloneHead = CloneNode;
        while(head.next!=null)
        {
            head = head.next;
            CloneNode = CloneNode.next;
            map.put(head, CloneNode);
        }
        CloneNode = CloneHead;
        while(CloneNode.next!=null)
        {
            CloneNode.extend = map.get(CloneNode.extend);
            CloneNode = CloneNode.next;
        }
        return CloneHead;
    }
    public static void main(String[] args)
    {
        ComplexList a = new ComplexList('A');
        ComplexList b = new ComplexList('B');
        ComplexList c = new ComplexList('C');
        ComplexList d = new ComplexList('D');
        ComplexList e = new ComplexList('E');
        a.next = b;
        b.next = c;
        c.next = d;
        d.next = e;
        b.extend = e;
        a.extend = c;
        d.extend = b;
        ComplexList result = CloneComplexList(a);
        while(result.next!=null)
        {
            System.out.print(result.val+" "+result.next.val+" ");
            if(result.extend!=null)
            {
                System.out.println(result.extend.val);
            }
            else
            {
                System.out.println();
            }
            result = result.next;
        }
    }
}
不使用辅助空间

代码:

static ComplexList CloneComplexList2(ComplexList head)
    {
        if(head==null)
        {
            return head;
        }
        ComplexList p = head;//记录原来链表的头结点
        while(head.next!=null)
        {
            ComplexList x = new ComplexList(head.val);
            x.next = head.next;
            head.next = x;
            head = x.next;
        }
        ComplexList x = new ComplexList(head.val);
        head.next = x;
        head = p;
        while(head.next.next!=null)
        {
            if(head.extend!=null)
            head.next.extend = head.extend.next;
            head = head.next.next;
            
        }
        head = p;
        ComplexList q = head.next,result;//记录克隆链表的头结点
        result = q;
        //System.out.println(q.val+" "+q.next.val);
        while(q.next!=null&&q.next.next!=null)
        {
            //System.out.println(q.val+" "+q.next.val);
            q.next = q.next.next;
            q = q.next;
        }
        return result;
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/485314.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人类倾向于高估人工智能的进步,低估自身智能的复杂性-读《AI 3.0》

有很多关于人工智能的书。亚马逊网站上就有20,000本。其中很多书都有戏剧性的标题&#xff0c;比如《生命3.0》 &#xff0c;《终极算法》 &#xff0c;尤其是《奇点来临》。梅勒妮 米切尔的新书的标题更加谦虚&#xff0c;但是在我看来&#xff0c;在这个主题上&#xff0c;它…

计算机操作系统——死锁(产生的必要条件与处理死锁的四个关卡)

计算机操作系统——死锁 前言&#xff1a;死锁&#xff1a;指多个进程因竞争共享资源而造成的一种僵局&#xff0c;若无外力作用&#xff0c;这些进程都将永远不能再向前推进。如果死锁发生&#xff0c;会浪费大量的系统资源&#xff0c;甚至会导致系统崩溃。 关于死锁的结论…

【剑指offer】面试题36:二叉搜索树与双向链表(java)

输入一棵二叉搜索树&#xff0c;将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点&#xff0c;只能调整树中节点指针的指向。 代码&#xff1a; package offer; class BineryTreeNode { int val; BineryTreeNode left null; BineryTreeNo…

科学难题的形成

来源&#xff1a;肖建华科学网博客传统上&#xff0c;把科学理论分为两类&#xff1a;唯象性科学理论和哲学性科学理论。大致而言&#xff0c;工程科学是以具体现象类来划分学科&#xff0c;此类学科的理论一般称为唯象性理论。而把各学科的共性特征抽象出来作为研究对象而建立…

冯·诺依曼计算机特点

冯诺依曼计算机特点 冯诺依曼&#xff0c;20世纪最重要的数学家之一。在现代计算机、博弈论、核武器和生化武器等众多领域内有杰出建树的最伟大的科学全才之一&#xff0c;被后人称为“计算机之父”和“博弈论之父”。 一、冯诺依曼计算机结构&#xff08;以运算器为中心&…

计算机操作系统——经典进程的同步问题

计算机操作系统——信号量机制与经典进程的同步问题 信号量机制 随着发展&#xff0c;信号量从整型信号量经记录型信号量&#xff0c;进而发展为“信号量集”机制。 一般来说&#xff0c;信号量的值与相应的资源的使用情况有关。 信号量的值仅由P、V操作改变。 信号量的初值…

【剑指offer】面试题39:数组中出现次数超过一半的数字

数组中有一个数字出现的次数超过数组长度的一半&#xff0c;请找出这个数字。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2 代码&#xff1a; class Solution { public int majorityElement(in…

2020年度全球人工智能十大事件

该文章内容转载自战略前沿技术当前&#xff0c;新一代人工智能技术在全球蓬勃兴起&#xff0c;迅猛发展&#xff0c;与大数据、区块链、5G等新技术相互融合、相互因应&#xff0c;为经济社会发展尤其是数字经济发展注入新动能&#xff0c;正在深刻改变社会生产生活方式。与此同…

一头扎进sql之多表操作

一、多表查询时NULL值处理 要求返回比"allen"工资低的所有员工select a.ename,a.conn from emp a where a.conn < (select b.conn from emp b where b.ename allen) ; 正确的写法应该是select a.ename,a.conn from emp a where coalesce(a.conn,0) < (se…

当贝叶斯,奥卡姆和香农一起来定义机器学习

来源&#xff1a;数学中国【导读】当贝叶斯、奥卡姆和香农一起给机器学习下定义&#xff0c;将统计学、信息理论和自然哲学的一些核心概念结合起来&#xff0c;我们便会会发现&#xff0c;可以对监督机器学习的基本限制和目标进行深刻而简洁的描述。令人有点惊讶的是&#xff0…

eclipse中下载spring-tool-suite插件遇到的问题

eclipse中下载spring-tool-suite插件遇到的问题 我的eclipse的版本4.7.0&#xff0c;接下来以下载我的eclipse的对应STS版本3.8.4为例&#xff0c;讲一下遇到的问题。不同版本的eclipse对应不同的spring-tool-suite&#xff0c;具体的版本对应可以去其他的博客中寻找&#xff…

python - 内置函数

enumerate 将一个可迭代/可迭代对象变成enumerate类型 利用for循环可以对enumerate类型获得索引和值 1 lis (星期一, 星期二, 星期三, 星期四, 星期五, 星期六, 星期七) 2 ret enumerate(lis, 1) # enumerate 可以接受第二个参数&#xff0c; 用于指定索引起始值 3 4 fo…

【剑指offer】面试题40:最小的k个数(java)

输入整数数组 arr &#xff0c;找出其中最小的 k 个数。例如&#xff0c;输入4、5、1、6、2、7、3、8这8个数字&#xff0c;则最小的4个数字是1、2、3、4。 示例 1&#xff1a; 输入&#xff1a;arr [3,2,1], k 2 输出&#xff1a;[1,2] 或者 [2,1] 示例 2&#xff1a; 输入…

MicroPython (一)点亮我的Led

工具 &#xff1a; puttyF429Discovery 开发板Notepad注意&#xff1a;不知道为什么 其他的终端工具有问题&#xff0c;推荐 putty 基本没有发现问题 putty 实时调试 使用putty 打开USB 虚拟串口&#xff0c;我们打开可以使用help()方法寻求帮助输入help()如下所示 help() Welc…

2021年,AI有潜力改善农业的十种路径

来源&#xff1a;Forbes作者&#xff1a;Louis Columbus编译&#xff1a;科技行者普华永道指出&#xff0c;基于物联网的农业&#xff08;IoTAg&#xff09;监控已经成为联网智能农业领域发展最快的技术领域&#xff0c;市场总额到2025年预计将增长至45亿美元。根据BI Intellig…

计算机组成原理——总线系统总结

计算机组成原理——总线系统总结 一、总线的概念&#xff1a; 总线是构成计算机系统放入互联机构&#xff0c;是多个系统功能部件之间进行数据传送的公共通路。借助于总线连接&#xff0c;计算机在各个系统功能部件之间实现地址、数据和控制信息的交换&#xff0c;并在争用资…

【剑指offer】面试题42:连续子数组的最大和(java)

输入一个整型数组&#xff0c;数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。 要求时间复杂度为O(n)。 示例1: 输入: nums [-2,1,-3,4,-1,2,1,-5,4] 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大&#xff0c;为 6。 提示…

科学家打造全套人工神经系统 帮助瘫痪病人重新控制身体

Photo: Nathaniel Welch来源&#xff1a; IEEE电气电子工程师Motion Restored: Luke Tynan, who was paralyzed in 2017 by a spinal cord injury, demonstrates the wearable system that enables him to control his arm and hand. Sensors on the arm register his intentio…

存储器容量扩展——位扩展、字扩展

存储器&#xff08;二&#xff09;——存储容量扩展 前言&#xff1a;&#xff08;基本概念&#xff09; 存储空间&#xff1a;CPU决定存储器&#xff1a;用户需求决定&#xff08;4G&#xff0c;8G&#xff09;&#xff08;8G的存储器1各芯片能否完成用户需求&#xff1f;如…

海明码构造及纠错

计算机组成原理——海明码的构造及纠错 海明码&#xff08;又称为汉明码&#xff09;是具有一位纠错能力的编码。 信息位&#xff1a;发送用户端想要发送的信息序列&#xff0c;彼此独立&#xff0c;互不相关&#xff0c;最终交给接收端。 检测位&#xff1a;为了使信息码元产…