算法训练营第三天 | 203.移除链表元素、707.设计链表 、206.反转链表

news2024/9/23 17:24:03

关于链表我们应该了解什么:

代码随想录

在实际开发中,遇到指针我们要做好防御性编程。


问题( 一 )

题目描述 :

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。

题目链接:

203. 移除链表元素 - 力扣(LeetCode)


问题分析:

          这到题目算是链表的基础操作 , 我这里写的是链表的前面是一个虚拟头节点,这样我们就不用考虑删除元素是否是头节点这个情况了 。主要掌握虚拟头节点,当然可以不用这个方法,但是这样会时链表的操作变得更加简洁。  删除的核心操作就是,找到要删除节点的前一个节点:他的next 就是我们要删除的节点    如果删除的节点的前一个节点是p,   那么 p->next = p->next->next。

视频讲解:

手把手带你学会操作链表 | LeetCode:203.移除链表元素_哔哩哔哩_bilibili


解决方案:

 ListNode* removeElements(ListNode* head, int val) {
     ListNode *virtualNode =new ListNode;    //定义一个虚拟头结点
     virtualNode->next=head;
     ListNode *temp=virtualNode;
     //遍历链表
     while( temp!= NULL && temp->next!=NULL){
        if(temp->next->val==val){   //找到了满足条件的节点
           //删除节点
           head=temp->next;
           temp->next=temp->next->next;
           delete head;
           continue;
         }
          temp=temp->next;
      }
     return virtualNode->next;
    }

问题( 二  )

题目描述 :

设计链表,可以是单链表也可以是双链表。

题目链接:

707. 设计链表 - 力扣(LeetCode)

问题分析:

        我自己给出的答案是单链表的设计 , 包括一些基础操作,增删查。我们需要知道的是链表也是从0开始计数的,删除和在指定位置插入,我们都是找到待操作位置的前一个位置。

视频讲解:

帮你把链表操作学个通透!LeetCode:707.设计链表_哔哩哔哩_bilibili

解决方案:

class MyLinkedList {    //才用虚拟头节点法

public:
    MyLinkedList() {
        head = new ListHead;
        head->next = NULL;
        head->val = 0;
        size = 0;
    }

    //获取元素
    int get(int index) {
        //防御性编程
        if (!head ) return -1;    //链表不存在,或者为空
        if (head->next == NULL)  return -1;
        if (index < 0)   return -1;  //下标不合法  
        if (index >= size)  return -1;
        int i = 0;
        ListNode* p = head;  //指向虚拟头结点
        while (i <=index) {
            p = p->next;
            i++;
        }
        return p->val;
    }

    //头部添加
    void addAtHead(int val) {
        if (!head) return;
        ListNode* node = new ListNode;    //生成一个节点
        node->val = val;
        node->next = head->next;
        head->next = node;
        size++;
    }

    //尾部添加
    void addAtTail(int val) {
        if (!head) return;    //判断链表是否存在
        ListNode* node = new ListNode;    //生成一个节点
        node->val = val;
        ListNode* p = head;   //指向第一个节点
        while (p->next!=NULL) {
            p = p->next;
        }
        //循环结束后说明刚好处于最后一个位置
        node->next = p->next;
        p->next = node;
        size++;
    }

    //在指定位置添加
    void addAtIndex(int index, int val) {
        if (!head) return;   //链表不存在
        if (index < 0) return; //位置不合法
        if (index > size) return;
        ListNode* p = head;   //指向虚拟头结点
        while ( index--) {
            p = p->next;
        }
        ListNode* node = new ListNode;    //生成一个节点
        node->val = val;
        node->next = p->next;
        p->next = node;
        size++;
    }

    //删除位置的元素
    void deleteAtIndex(int index) {
        if (!head ) return;
        if (head->next == NULL)  return;   //没有元素
        if (index < 0)   return ;  //下标不合法  
        if (index >= size)  return ;
        LinkList* p = head;
        if (index == 0) {
            head->next = head->next->next;
            size--;
            return;
        }

        while ( index-- ) {
            p = p->next;
        }
        cout << p->val << endl;
        LinkList* temp = p->next;
        p->next = p->next->next;
        delete temp;
        size--;
    }
    void print() {
        ListNode* node = head->next;
        while (node) {
            cout << node->val << "  ";
            node = node->next;
        }
        cout << endl;
    }

private:
  //节点结构
typedef struct LinkList {
    struct LinkList* next;
    int val;
}ListHead,ListNode;
    ListHead* head;
    int size;   //链表的长度
  
};

问题(  三  ) 

题目描述 :给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

题目链接:

206. 反转链表 - 力扣(LeetCode)

问题分析:

        这到题目,我们采用双指针的思路。指针 pro 用来记录我们head的前一个节点,开始没有翻转之前,head的前一个节点为NULL ,所有pro初始值为NULL,而我们的第二个指针 temp 则用来记录head的下一个节点。

 循环遍历我们的链表,终止条件是  head 指针为空,1-》2断开之后,1-》的next指向了 NULL,然后我们的  temp继续往后移动,而我们的 pro 则指向 head。

视频加文字讲解:

代码随想录

 解决方案:

ListNode* reverseList(ListNode* head) {
    if(!head)  return NULL;   //链表为空
    if(head->next==NULL) return head;    //只有一个元素的情况
    ListNode *pro=NULL ; //用来只想当前位置的前一个节点
    ListNode *temp=head ;
    while( head ){
       temp = temp->next;
       head->next=pro;

       pro=head;
       head=temp;
    }
    head=pro;
    return head;  
}

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

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

相关文章

H5营销观察:H5破圈传播有什么秘诀

在移动互联网时代&#xff0c;流量越加碎片化&#xff0c;场景变得相对短促和兴趣导向&#xff0c;一个营销H5产生的每一次点击、每一次互动、每一次流量停留背后都会有相应的动机&#xff0c;也是营销流量效果的成因。 今天&#xff0c;我们一起来探究下什么样的内容更容易传播…

calcite 校验层总结

1、校验的作用 1&#xff09;完善语义信息 例如在SQL语句中&#xff0c;如果碰到select * 这样的指令&#xff0c;在SQL的语义当中&#xff0c;“*” 指的是取出对应数据源中所有字段的信息&#xff0c;因此就需要根据元数据信息来展开。 2&#xff09;结合元数据信息来纠偏…

微服务-统一网关Gateway

网关的作用 对用户请求做身份认证、权限校验将用户请求路由到微服务&#xff0c;并实现负载均衡对用户请求做限流 搭建网关服务 创建新module&#xff0c;命名为Gateway&#xff0c;引入依赖&#xff08;1.SpringCloudGateway依赖&#xff1b;2.Eureka客户端依赖或者nacos的服…

web开发简单知识

文章目录 springboot快速入门快速构建SpringBoot工程起步依赖原理分析springboot配置配置文件分类yaml的基本语法yaml数据格式获取数据profile内部配置加载顺序外部配置加载顺序 springboot整合整合junit整合redis整合mybatis springboot原理分析springboot自动配置Condition 监…

“第五十二天”

算术逻辑单元&#xff1a; 之前提过的运算器包括MQ,ACC,ALU,X,PSW&#xff1b;运算器可以实现运算以及一些辅助功能&#xff08;移位&#xff0c;求补等&#xff09;。 其中ALU负责运算&#xff0c;运算包括算术运算&#xff08;加减乘除等&#xff09;和逻辑运算&#xff08…

蓝桥杯双周赛算法心得——通关(哈希+小根堆)

大家好&#xff0c;我是晴天学长&#xff0c;这是很重要的贪心思维题&#xff0c;哈希的存法和小根堆的表示很重要。 1) .通关 2) .算法思路 通关 用hash&#xff08;int[]&#xff09;存点的子节点并按输入顺序存关卡的号码&#xff08;输入顺序就是&#xff09; 列如&#…

Unity的live2dgalgame多语言可配置剧情框架

这段代码用于读取表格 using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using OfficeOpenXml; using System.IO; using UnityEngine.Networking; using UnityEngine.UI; using Random UnityEngine.Random;public class Plots…

【Linux】部署单机OA项目及搭建spa前后端分离项目

一&#xff0c;部署oa项目 在虚拟机中&#xff0c;将项目打包成war文件放置到tomcat根目录下的webapps文件目录下 再在主机数据库中连接数据库&#xff0c;并定义数据库名导入相关的表 继续进入tomcat目录下双击点击startup.bat&#xff0c;启动oa项目 主机访问OA项目 如果登入…

MySQL之事务、存储引擎、索引

文章目录 前言一、事务1.概念2.操作&#xff08;1&#xff09;开启事务&#xff08;2&#xff09;提交事务&#xff08;3&#xff09;回滚事务 3.四大特性ACID&#xff08;1&#xff09;原子性&#xff08;Atomicity&#xff09;&#xff08;2&#xff09;一致性&#xff08;Co…

Web APIs——焦点事件以及小米搜索框

一、事件类型 二、焦点事件 <body><input type"text"><script>const input document.querySelector(input)input.addEventListener(focus,function(){console.log(有焦点触发)})input.addEventListener(blur,function(){console.log(失去焦点触…

H5新Api | requestIdleCallback - requestAnimationFram

文章目录 浏览器渲染机制事件循环机制宏队列与微队列浏览器中事件循环流程 requestAnimationFrame(rAF)requestAnimationFrame API requestIdleCallbackrequestIdleCallback API任务拆分requestIdleCallback的使用场景 浏览器渲染机制 每一轮 Event Loop 都会伴随着渲染吗&…

力扣:142. 环形链表 II(Python3)

题目&#xff1a; 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评…

命令行参数、环境变量

我们在使用C语言的时候&#xff0c;经常的写法是int main(){//函数体}。 而且我们也知道它也只是一个函数&#xff0c;当一个进程启动的时候&#xff0c;会有专门的函数来调用这个函数。 那他有没有函数参数呢&#xff1f;其实也是有的&#xff0c;我们今天&#xff0c;就来认识…

常用的网络攻击手段

前言&#xff1a;本文旨在介绍目前常用的网络攻击手段&#xff0c;分享交流技术经验 目前常用的网络攻击手段 社会工程学攻击物理攻击暴力攻击利用Unicode漏洞攻击利用缓冲区溢出漏洞进行攻击等技术 社会工程学攻击 社会工程学 根据百度百科定义&#xff1a; 社会工…

2023/10/27 JAVA学习

tab键可以对文件名进行补全 想切到其他盘的某个文件,必须先使用切盘命令 在当前文件目录输入cmd,可直接打开命令行窗口,并且处于当前文件目录 运行java文件,只用文件名不需要后缀 记得勾选文件扩展名 直接这样执行不会出现class文件,因为在底层临时生成了一个,不会长久的出现

NX二次开发后处理中保存tcl变量值到文本

直接上代码&#xff1a; static bool GetTclValue(UF_MOM_id_t mom_id, char *szName, char *szInfo, std::string &stValue,bool bShowValue /* false*/) {UF_MOM_ask_string(mom_id, szName, (const char **)&szInfo);if (szInfo){stValue szInfo;if (bShowValue){…

ArrayList的线程安全类CopyOnWriteArrayList

目录 一、CopyOnWriteArrayList简介二、CopyOnWriteArrayList的优缺点1、优点2、缺点 三、CopyOnWriteArrayList使用场景1、数据库缓存2、消息队列3、数据统计和分析 四、使用CopyOnWriteArrayList时需要注意哪些问题&#xff1f;1、内存占用问题2、数据一致性问题3、线程安全4…

Milvus 入门教程

文章目录 下载docker-compose配置文件安装 docker安装docker-compose直接下载release版本手动安装使用pip 命令自动安装 通过 docker-compose 启动容器连接 Milvus停止 milvus删除milvus的数据 下载docker-compose配置文件 先安装wget命令 yum install wget下载配置文件&…

C++之C++11字符串字面量后缀总结(二百四十八)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…