代码随想录第四天(203、707)

news2025/1/15 13:03:17

文章目录

  • 一、链表知识
  • 203. 移除链表元素
    • 提交
    • 看答案之后的豁然开朗
  • 707. 设计链表
    • 完全不会,看完答案后改的

一、链表知识

1、链表在内存中的存储不是连续的
在这里插入图片描述
意思是这个链表的其实节点是2,终止节点是7
2、链表和数组的对比
在这里插入图片描述
数组的长的是固定的,不能改变
链表的长度不固定
3、链表的定义(代码)

public class ListNode {
    // 结点的值
    int val;

    // 下一个结点
    ListNode next;

    // 节点的构造器(无参)
    public ListNode() {
    }

    // 节点的构造器(有一个参数)
    public ListNode(int val) {
        this.val = val;
    }

    // 节点的构造器(有两个参数)
    public ListNode(int val, ListNode next) {
        this.val = val;
        this.next = next;
    }
}

203. 移除链表元素

第一次提交失败,原因是没有考虑清楚:
①题目给的头节点是指的真正链表的头节点,还是一个指向真正头结点的虚拟节点
②返回值写成head出错,因为如果整个链表都是要删除的,head节点也就被删除了,应该返回的是虚拟节点的nex
t③给出的测试用例中有一种是链表为空的情况,而我写的temp=head.next;此时链表为空,也就是head是null,但是我又让temp存储head的next值,所以出现空指针异常的错误。因为此时head节点都不存在,而且注意,这里报的错是执行出错,而不是编译出错,也就是不是书写的问题。这里应该让temp指向pre的next值,因为pre是肯定存在的
④看完答案后,发现应该创建一个虚拟指针一直指向创建的虚拟节点,这样返回值可以直接返回这个虚拟节点的next值,比较方便。如果没有这个固定的指针,返回值想写return head是不对的,解释类似于前面的③
在这里插入图片描述
在这里插入图片描述

提交

**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode removeElements(ListNode head, int val) {
        ListNode first=new ListNode(0,head);
        ListNode pre=first;
        ListNode temp=pre.next;
        while(temp!=null){
            if(temp.val==val){
                pre.next=temp.next;
            }else{
                pre=pre.next;
            }
            
            temp=pre.next;
        }
        pre.next=null;
        return first.next;
    }
}

看答案之后的豁然开朗

1、整个链表题分为两种情况,一种是创建虚拟节点,这样能够让头结点的删除和其他节点的删除操作一样;另一种是不设置虚拟节点,这种情况就要先对头节点进行处理,这是分为两步,第一步先检查头结点的值,如果是要删除的值,让头节点后移,直到移动到链表结尾或者发现第一个不是要删除值的节点;第二步是,判断此时的头结点的next是不是空,如果是空,代表此时链表为空,直接返回,若不是空,在进行后面节点的删除操作
2、答案里面新建的虚拟节点的值写的是-1,不是0
3、答案中一共给了三种方法,一种是添加虚拟节点的,一种是不添加虚拟节点,但有pre,还有一种是既没有虚拟节点,也没有pre的,这种就是用到了temp指向头节点,然后用了temp.next.next

707. 设计链表

不知道怎么做,因为不知道怎么在方法里定义虚拟头节点,然后怎么样让这个虚拟头节点指向链表的头节点。而且还要判断index的值是否无效,这就要看链表长度是否小于等于index,但是链表长度又不知道。
看答案发现,这些问题定义在这个类中的一个方法中,这个方法创建了头节点、尾节点,还需要特别注意,就是将这两个节点的指针进行关联,不然后面会报空指针异常,因为初始化的两个节点默认带的两个指针都是ListNode这个引用类型,所以初始化值都是null。关联的代码是:head.next=tail;
tail.prev=head;

另外,有一个忽视的点:for循环
for (表达式1; 表达式2; 表达式3)
{
语句;
}
过程:
求解表达式1。
求解表达式2。若其值为真,则执行 for 语句中指定的内嵌语句,然后执行第3步;若表达式2值为假,则结束循环,转到第5步。
求解表达式3。
转回上面第2步继续执行。
循环结束,执行 for 语句下面的语句。

完全不会,看完答案后改的

【注意】
①再添加完节点后,方法里面要有对size++的调整
②删除操作记得size - -

class ListNode{//定义链表节点类
    int val;
    ListNode next;
    ListNode prev;
    public ListNode(){

    }
    // public ListNode(int val,ListNode next,ListNode prev){
    //     this.val=val;
    //     this.prev=prev;
    //     this.next=next;
    // }
    public ListNode(int val){
        this.val=val;
    }
}



class MyLinkedList {
    int size;  //这一部分先定义类的属性,可以在这里进行赋初值操作
    ListNode head;    
    ListNode tail;

    public MyLinkedList() {//空参构造器中的意味着只要创建一个这个类的对象
    //就会造相应的头、尾节点,为了防止后面的节点的next和prev出现null从而
    //在赋值过程中出现空指针异常,这里要将两个节点的next和prev关联上
        size=0;
        // ListNode head=new ListNode(-1,null,null);
        head=new ListNode(-1);
        tail=new ListNode(-1);
        head.next=tail;
        tail.prev=head;

    }
    
    public int get(int index) {//其实这个方法在看答案的过程中发现
    //分了两种情况,当时以为是可写可不写的,作用只是加快了查找速度,
    //但后来发现,其实分两种情况就避免了空指针异常的情况
        if(index<0||index>size-1){
            return -1;
        }
        // ListNode c=new ListNode();
        ListNode c;
        c=head;
        for(int i=0;i<=index;i++){
            c=c.next;
        }
        return c.val;
    }
    
    public void addAtHead(int val) {
        // ListNode addone=new ListNode(val,null,null);
        ListNode addone=new ListNode(val);
        // addone.next=head.next;
        // head.next.prev=addone;
        // head.next=addone;
        // addone.prev=head;
        addAtIndex(0,val);
    }
    
    public void addAtTail(int val) {
        // ListNode addone=new ListNode(val,null,null);
        ListNode addone=new ListNode(val);
        // ListNode c=head;
        // while(c.next!=null){
        //     c=c.next;
        // }
        // c.next=addone;
        // addone.prev=c;
        addAtIndex(size,val);
    }
    
    // public void addAtIndex(int index, int val) {
    //     if(index>size-1){
    //         return;
    //     }else if(index==size-1){
    //         addAtTail(val);
    //     }else if(index<=0){
    //         addAtHead(val);
    //     }else{
    //         // ListNode addone=new ListNode(val,null,null);
    //         ListNode addone=new ListNode(val);
    //         ListNode c=head;
    //             for(int i=0;i<index;i++){
    //                 c=c.next;
    //             }           
    //         c.next.prev=addone;
    //         addone.next=c.next;
    //         c.next=addone;
    //         addone.prev=c;
    //     }
    // }

    public void addAtIndex(int index, int val) {
        if(index>size){
            return;
        }
        int num=Math.max(0,index);
        ListNode c=head;
        for(int i=0;i<num;i++){
            c=c.next;
        }
        ListNode addone=new ListNode(val);
        addone.next=c.next;
        c.next.prev=addone;
        c.next=addone;
        addone.prev=c;
        size++;//记得!!!!!!
    }
    
    // public void deleteAtIndex(int index) {
    //这个算法是第一次写的,运行时老是出错
    //     if(index<0||index>size-1){
    //         return;
    //     }
    //     ListNode c=head;
    //     for(int i=0;i<index;i++){
    //         c=c.next;
    //     }
    //     c.next=c.next.next;
    //     c.next.next.prev=c;//老是提示prev前面的对象是null
    //出现了空指针异常,特殊情况就是要删除最后一个节点等情况时,后面
    //没有结点了,而分两种情况就可以避免寻找在index靠后时还寻找
    //c.next.next.prev,而是往前找
    //     size--;
    // }

     public void deleteAtIndex(int index) {
        if (index < 0 || index >= size) {
            return;
        }
        ListNode pred, succ;
        if (index < size - index) {
            pred = head;
            for (int i = 0; i < index; i++) {
                pred = pred.next;
            }
            succ = pred.next.next;
        } else {
            succ = tail;
            for (int i = 0; i < size - index - 1; i++) {
                succ = succ.prev;
            }
            pred = succ.prev.prev;
        }
        size--;
        pred.next = succ;
        succ.prev = pred;
    }


}

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

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

相关文章

【Iot】阿里云物联网平台入门之什么是消息解析、什么是Topic、JavaScript脚本示例解析

在IoT场景中&#xff0c;很多传感器采集到的都是二进制数据&#xff0c;或者私有协议格式数据流&#xff0c;设备端又不具备转换成结构化JSON的能力&#xff0c;这时候我们可以借助IoT物联网平台云端自定义数据解析能力&#xff0c;转换Modbus&#xff0c;电力协议&#xff0c;…

YOLO家族系列模型的演变:从v1到v8(下)

昨天的文章中&#xff0c;我们回顾了 YOLO 家族的前 9 个架构。本文中将继续总结最后3个框架&#xff0c;还有本月最新发布的YOLO V8. YOLOR Chien-Yao Wang, I-Hau Yeh, Hong-Yuan Mark Liao “You Only Learn One Representation: Unified Network for Multiple Tasks”202…

JavaWeb-JavaScript

JavaWeb-JavaScript 1&#xff0c;JavaScript简介 JavaScript 是一门跨平台、面向对象的脚本语言&#xff0c;而Java语言也是跨平台的、面向对象的语言&#xff0c;只不过Java是编译语言&#xff0c;是需要编译成字节码文件才能运行的&#xff1b;JavaScript是脚本语言&#…

43. 【农产品溯源项目前后端Demo】后端二次开发的重点修改位置

前面讲过农产品溯源Demo比较简单,如果想二次开发需要重点关注的目录。 如果要开发一个新的API、对接新的合约,需要有哪些步骤? 定义数据结构,在domain包新增Class,定义好数据字段,定义好get、set方法。domain包没有业务的逻辑实现,只有结构、字段定义。 如果字段首字母小…

手摸手学会node框架之一——koa 傻瓜式小白教程

一、Koa简介 基于 Node.js 平台的下一代 web 开发框架。 由 Express 幕后的原班人马打造&#xff0c; 致力于成为 web 应用和 API 开发领域中的一个更小、更富有表现力、更健壮的基石。 详细请参考Koa官网进行学习。 二、Koa基础入门 1.项目初始化 执行 npm init -y, 生成…

博客之星规则能否参照“金球奖”

文章目录课前小差粉丝对我的价值粉丝数量的提升KOL与粉丝链接粉丝影响收入博客之星规则设想博客之星新玩法&#xff1f;内部评审展望2023写在最后课前小差 哈喽&#xff0c;大家好&#xff0c;我是几何心凉&#xff0c;这是一份全新的专栏&#xff0c;唯一得倒CSDN王总的授权&…

小侃设计模式(廿一)-状态模式

1.概述 状态模式&#xff08;State Pattern&#xff09;是行为型设计模式的一种&#xff0c;它主要用来解决对象存在多种状态转换时&#xff0c;需要对外输出不同的行为。状态模式与策略模式有一定相似&#xff0c;区别在于策略模式行为彼此独立&#xff0c;可以进行相互替换&…

VueJs中的toRef与toRefs函数的一个比较

前言ref是处理基本数据类型响应式API函数,在setup中声明定义的变量,可以直接在模板中使用没有被响应式API包裹处理的变量数据,是不具备响应式能力的也就是往往在逻辑中修改了数据,但是页面不会更新,那怎么样将一个非响应式数据变成响应式数据就需要用到toRef()与toRefs()这两个…

【计算机网络】网络编程套接字

文章目录理解源IP地址和目的IP地址理解端口号和进程ID理解源端口号和目的端口号认识TCP协议认识UDP协议网络字节序socket编程接口socket网址查看socket常见APIUDP协议实现网络通信UDP创建socket文件描述符sockaddr结构UDP绑定端口号UDP接收发送网络数据简单的UDP网络程序TCP协议…

拉伯证券|大股东或易主,阿里巴巴换股入局

三大股指齐上扬&#xff0c;早盘主力埋伏这些股。 到午间收盘&#xff0c;“家居零售榜首股”之称的美凯龙一字涨停&#xff0c;港股红星美凯龙涨24%&#xff0c;此前一度涨超30%。 消息面上&#xff0c;1月13日晚间&#xff0c;美凯龙发布公告称&#xff0c;公司控股股东红星…

transformer算法解析

本文参考&#xff1a; 详解Transformer &#xff08;Attention Is All You Need&#xff09; - 知乎 Transformer 代码完全解读&#xff01;_AI科技大本营的博客-CSDN博客 Transformer学习笔记一&#xff1a;Positional Encoding&#xff08;位置编码&#xff09; - 知乎 1、…

【C语言】自定义类型

前言男孩子在外面要保护好自己~一、结构体为什么会有结构体呢&#xff1f;但要描述一个复杂对象时&#xff0c;仅用之前学过的基本数据类型表达不了&#xff08;如&#xff1a;我要描述一个人&#xff0c;仅靠基本数据类型只能说定义他的一种属性<如用 int 定义他的年龄>…

字符串的处理

一、字符数组 用来存放字符型数据的数组称为字符数组&#xff0c;其元素是一个个的字符。 char 字符数组名[常量表达式]&#xff1b; C语言规定字符串是以\0字符作为结束符的字符数组。 在程序中可以通过判断数组元素是否为空字符来判断字符串是否结束。 字符串的输…

介绍Java中的常/变量.各种数据类型以及类型转换和提升的用法

本文简单描述了什么是常量和变量,介绍了Java各种数据类型:基本数据类型(四类八种,大小和范围)和引用数据类型(种类),简单介绍了包装类字符串类型,以及不同数据类型之间的常量和变量,数据类型之间的转换和提升… Java常/变量和数据类型一.什么是常量?二.什么是变量?三.数据类型…

[审核]因为审核人员不了解苹果登录被拒

1.审核被拒信息 Guideline 2.1 - Information Needed We’re looking forward to completing the review of your app, but we need more information to continue. Next Steps Please provide detailed answers to the following questions in your reply to this message i…

寒假集训一期总结(一)–––思维训练

目录 思维训练 走方格 解题思路 参考代码 最短曼哈顿距离 ​编辑 解题思路 参考代码 酒厂选址 解题思路 参考代码 雪地足迹Tracks in the Snow 解题思路 参考代码 一个星期没有更博客了…这一个星期,去学校信竞集训的我收获颇丰,下面就是我的还加集训总结 思…

【小白向】让电脑成为热点WIFI

让电脑成为热点WIFI 本文针对下述情况&#xff0c;有一台电脑&#xff0c;一部手机&#xff0c;但是电脑通过网线连接。此时电脑可以上网&#xff0c;手机没有流量&#xff0c; 仅能通过WIFI上网&#xff0c;但此时没有WIFI。 其实你的电脑可能自己本身就能作为热点发布WIFI&…

绕任一向量旋转矩阵计算思考与实现

欢迎关注更多精彩 关注我&#xff0c;学习常用算法与数据结构&#xff0c;一题多解&#xff0c;降维打击。 问题提出 如图所示&#xff0c;在空间中有一向量A&#xff0c;问点O绕A方向逆时针旋转角度α的矩阵如何表示。 问题分析 问题化规 直接去构造一个矩阵是比较困难的。…

自从我学会了Jenkins的自动构建,我再也没有每次都打包上传到服务器然后发布Java服务了

上次我们讲了使用Jenkins部署maven项目 工作两年半&#xff0c;终于学会了Jenkins部署Maven项目 这次我们来讲一下每次提交代码的时候Jenkins自动构建 我们使用的代码仓库是gitee 文章目录&#x1f3c3;第一步&#xff0c;我们在Jenkins中安装gitee插件&#x1f3c3;第二步&am…

Go语言并发编程及依赖管理

目录&#x1f9e1;并发编程GoroutineCSP(Communicating Sequential Processes)&#x1f9e1;依赖管理依赖演变依赖管理三要素&#x1f49f;这里是CS大白话专场&#xff0c;让枯燥的学习变得有趣&#xff01; &#x1f49f;没有对象不要怕&#xff0c;我们new一个出来&#xff0…