牛客网剑指offer|中等题day2|JZ22链表中倒数最后k个结点(简单)、JZ35复杂链表的复制(复杂)、JZ77按之字形顺序打印二叉树(中等)

JZ22链表中倒数最后k个结点(简单)

链接:链表中倒数最后k个结点_牛客题霸_牛客网

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param pHead ListNode类 
     * @param k int整型 
     * @return ListNode类
     */
    ListNode* FindKthToTail(ListNode* pHead, int k) {
        // write code here
        //遍历一遍链表,得到它的长度n
        // 对于倒数第k个节点,要走n-k步

        ListNode *r=pHead;
        int n=0;
        while(r!=nullptr)
        {
            r=r->next;
            n++;
        }
        if(n==0)
        {
            return nullptr;
        }
        else {
          int step=n-k;//4-2=2
          if(step<0)
          {
            return nullptr;
          }
          r=pHead;
          while(step && r!=nullptr)
          {
            step--;
            r=r->next;
          }
          return r;

        }
    }
};

 JZ35复杂链表的复制(复杂)

链接:复杂链表的复制_牛客题霸_牛客网

 

 最终代码是自己写出来了。但是其中进入了几个误区:

1、误区一:觉得建立的新节点可以直接指向源节点的next和random,实际上这样做指向的还是源节点,而对于往后一个个建立的新节点,下一个next是能写的,但是random可能在下2、5个之后才创建,所以是一个难点。

2、误区二:一开始觉得可以在遍历源链表后,因为原链表的next指针域已经遍历过不再用,所以想让源节点的指针域更新为存储新节点 的地址,即A->next=A_copy;则A_copy->random=A->random->next;都理解错了

后来想到可以借助map,直接把源节点地址和新建立的节点地址一一对应,

则遍历源链表两次,第一次建立新链表,每个next更新为新节点地址;

                                第二次更新新链表的random指针域。

代码如下:

/*
struct RandomListNode {
    int label;
    struct RandomListNode *next, *random;
    RandomListNode(int x) :
            label(x), next(NULL), random(NULL) {
    }
};
*/
class Solution {
public:
    RandomListNode* Clone(RandomListNode* pHead) {
        RandomListNode *copy_L=new RandomListNode(-1);//复制链表的头节点
        RandomListNode *p1=pHead,*p2=copy_L;


         unordered_map<RandomListNode*,RandomListNode*>umap;
        while(p1)
        {
           // cout<<p1->label<<endl;
            RandomListNode *temp=new RandomListNode(p1->label);
            p2->next=temp;
            p2=temp;

            umap[p1]=p2;
            p1=p1->next;
       
            //之所以这样,是想利用A2->random=A1->random->next;
        }

        //重新更新深拷贝链表的random域
        p2=copy_L->next;
        p1=pHead;
        while(p2 && p1)
        {
            //cout<<p2->label<<endl;
            p2->random=umap[p1->random];
            p2=p2->next;
            p1=p1->next;

        }
        return copy_L->next;
        
    }
};

 JZ77按之字形顺序打印二叉树(中等)

链接:按之字形顺序打印二叉树_牛客题霸_牛客网

 挺经典的层序遍历,看了题解还有另一种解法两个栈,但是我没有进一步了解。偷懒用了

reverse函数


/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
*/
class Solution {
public:
    vector<vector<int> > Print(TreeNode* pRoot) {
        //很显然是层序遍历,然后每层的res再reverse
        queue<TreeNode*>q;
        vector<vector<int>>v;
        if(pRoot==nullptr)
        {
            return v;
        }
        q.push(pRoot);
        //cout<<pRoot->val<<endl;
        int index=0;
        while(!q.empty())
        {
            int len =q.size();
            vector<int>res;
            for(int i=0;i<len;i++)         
            {
                TreeNode *temp=q.front();
                res.push_back(temp->val);
                q.pop();
                if(temp->left)
                {
                    q.push(temp->left);
                }
                if(temp->right)
                {
                    q.push(temp->right);
                }
            }
            if(index%2==1)
            {
             reverse(res.begin(),res.end());
            }
            /*for(auto p:res)
            {
                cout<<p<<" ";
            }
            cout<<endl;
            */
            v.push_back(res);
            index++;
        }
        return v;
        
    }
    
};

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一、PEMFC基础之热力学

一、PEMFC基础之热力学 1.内能U、焓H、熵S、吉布斯自由能G、赫姆霍兹自由能F关系图2.可逆电压与温度和压力的关系3.能斯特方程4.燃料电池效率 1.内能U、焓H、熵S、吉布斯自由能G、赫姆霍兹自由能F关系图 2.可逆电压与温度和压力的关系 标准状态可逆电压Er计算&#xff1a; E …

基于springboot的4S店车辆管理系统(源码等)

摘 要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&…

Linux进程状态及优先级

本文已收录至《Linux知识与编程》专栏&#xff01; 作者&#xff1a;ARMCSKGT 演示环境&#xff1a;CentOS 7 进程状态及优先级 前言正文进程状态就绪运行状态R阻塞睡眠状态 S休眠状态D挂起 暂停状态T前台与后台进程待追踪暂停状态t 死亡状态 X僵尸状态 Z 孤儿进程进程优先级查…

美颜SDK的隐私保护与安全性分析

随着智能手机和移动应用的普及&#xff0c;美颜SDK已经成为了很多应用的标配。美颜SDK的使用可以让用户在拍照或者视频聊天时&#xff0c;实现自拍美颜、滤镜、磨皮、瘦脸等效果。但是&#xff0c;在享受美颜SDK带来的便利的同时&#xff0c;我们也需要关注美颜SDK的隐私保护与…

配置文件Application.properties

配置文件Application.properties 属性配置配置文件的多种格式yaml的数据格式读取yaml文件中的属性值读取yaml文件中的全部属性yaml文件 数据库的属性 属性配置 在application.properties中添加server.port端口号即可 # 服务器端口配置 server.port80# 修改banner 关闭banner …

两分钟成为 ChatGPT 国内高手【不要再拿ChatGPT当百度用了】

不要再问ChatGPT那些问百度的问题了&#xff0c;有更进阶的用法 更高效的编写prompts&#xff0c;以便ChatGPT给出更精准的回答 但是需要注意的是&#xff1a;国内现在根本没有GPT-4使用&#xff0c;但凡是说有GPT-4的都是骗子。 GPT 可以写文章&#xff0c;可以写诗&#x…

MATLAB实现建筑热平衡模型建立及节能温控方案

全球大约1/3的能源消耗于建筑。在能源紧张的今天&#xff0c;如何减少建筑的能源浪费是一个值得研究的课题。 本文在综合国内外建筑能耗模拟方法的基础上&#xff0c;采用热平衡法&#xff0c;针对一小型建筑建立了热特性仿真模型&#xff0c;选用武汉地区的气象数据&#xff…

快递出入库管理APP开发 收发快递更方便

网购的盛行让收发快递成为很多人日常生活必不可少的一个环节&#xff0c;对于快递公司来说&#xff0c;每天有那么多的快递&#xff0c;如果没有一个好用的管理系统的话&#xff0c;不仅麻烦还很容易出现纰漏&#xff0c;所以快递出入库管理APP软件就显得很必要了。 快递…

【ChatGPT】你会是被AI抢饭碗的那类人吗?

文章目录 前言一、AI替代“基础性工作”&#xff0c;二、AI没有魔法&#xff1a;人类做不到&#xff0c;它也做不到三 人类的恐惧&#xff1a;被替代、被超越四 AI让语言返祖&#xff0c;小语种与文化“濒危灭绝”五 人类的未来&#xff0c;教育何去何从&#xff1f;总结 前言 …

浅谈jmeter性能测试步骤入门

一、Jmeter简介 1 概述 jmeter是一个软件&#xff0c;使负载测试或业绩为导向的业务&#xff08;功能&#xff09;测试不同的协议或技术。 它是 Apache 软件基金会的Stefano Mazzocchi JMeter 最初开发的。 它主要对 Apache JServ&#xff08;现在称为如 Apache Tomca…

[ tool ] Xpath选择器和selenium工具基本使用

XPath xpath介绍 是一门在XML文档中查找信息的语言 html文档准备 doc <html><head><base hrefhttp://example.com/ /><title>Example website</title></head><body><div idimages><a hrefimage1.html aabb>Name: My…

【镜像取证篇】仿真碎片-记一次镜像仿真失败的复盘过程

【镜像取证篇】仿真碎片-记一次镜像仿真失败的复盘过程 这个是很久以前的一个镜像实验&#xff0c;当时仿真可以看到Windows的启动界面&#xff0c;但却一直无法正常进入系统&#xff0c;不断的尝试修复&#xff0c;都是显示错误&#xff0c;最后把类型改为IDE后&#xff0c;成…

Kotlin高级协程

Kotlin高级协程 一.前言二.先从线程说起三.协程的设计思想四.协程特点&#xff1a;优雅的实现移步任务五.协程基本使用六.协程和线程相比有什么特点&#xff0c;如何优雅的实现异步任务 一.前言 在文章正式上干货之前&#xff0c;先说一点背景吧&#xff1b;我是 Kotlin 协程官…

MySQL基础(三)基本的SELECT语句

1. SQL概述 1.1 SQL背景知识 1946 年&#xff0c;世界上第一台电脑诞生&#xff0c;如今&#xff0c;借由这台电脑发展起来的互联网已经自成江湖。在这几十年里&#xff0c;无数的技术、产业在这片江湖里沉浮&#xff0c;有的方兴未艾&#xff0c;有的已经几幕兴衰。但在这片浩…

chatgpt可以降重论文吗-chatgpt降重论文软件

chatgpt可以降重论文吗 ChatGPT是一种自然语言处理技术&#xff0c;可以生成符合指定条件的文本。因此&#xff0c;理论上可以使用ChatGPT来降重论文。但是&#xff0c;需要注意以下几点&#xff1a; 是否符合学术道德要求&#xff1a;学术论文的降重需要严格遵守学术道德准则…

入职6个月,被裁了...

我跟大多数人不大一样&#xff0c;从来没有说要等公司主动裁员拿补偿&#xff0c;我看自己没有什么价值或者是公司不行了&#xff0c;我都会主动离职。但是这次也太突然了。公司很大已上市&#xff0c;并不是不行了&#xff0c;总结原因就是&#xff0c;一是领导无能&#xff0…

Vector - CAPL - CANoe硬件配置函数 - 03

目录 canFlushTxQueue -- 刷新已定义的Tx队列 代码示例 canSetChannelAcc -- CANoe接收过滤器设置 代码示例 canSetChannelMode -- CAN控制器Tx使能/失能 代码示例 canSetChannelOutput -- Ack自应答使能/失能 代码示例 getCardTypeEx -- CAN控制器类型 canFlushTxQue…

springboot+mybatis搭建maven多模块工程

最近看了一篇博客&#xff0c;选定springbootmybatis作为框架&#xff0c;在idea中搭建maven的多模块工程&#xff0c;下面也再温习一下&#xff0c;并将搭建过程分享出来&#xff0c;供小伙伴们参考。 1、开发工具及系统环境 Idea 2020.3系统环境为win10mysql5.7springboot2.…

基于SpringBoot的CSGO赛事管理系统

系统分析 需求分析 CSGO赛事管理系统的作用&#xff0c;可以提高CSGO赛事管理的工作人员的效率&#xff0c;协助他们对CSGO赛事信息进行统一管理&#xff0c;为管理者提供信息储存和查询搜索系统。一个良好的CSGO赛事管理系统可以实现对CSGO赛事信息的精细化管理&#xff1a;…

k8s基础5——Pod常用命令、资源共享机制、重启策略和健康检查、环境变量、初始化容器、静态pod

文章目录 一、基本了解二、管理命令三、yaml文件参数大全四、创建pod的工作流程五、资源共享机制5.1 共享网络5.2 共享存储 六、生命周期重启策略健康检查七、环境变量八、Init Containe初始化容器九、静态Pod 一、基本了解 概念&#xff1a; Pod是一个逻辑抽象概念&#xff0c…