链表常见题型(1)

1.反转链表

1.1反转链表

      如果我们想要反转链表,那应该有head的next指针指向空,其余结点的next指针反过来,指向它的上一个结点,那我们在执行该操作的时候就需要定义变量cur(current)表示我们当前遍历到的结点,变量pre(previous)表示上一个结点,对于第一个结点来说,它的上一个结点为空,我们需要把当前的next指针指向上一个结点,但两个变量够吗?当我们修改当前结点的next指针时,它的下一个结点就丢失了,所以在修改之前还需要再定义一个变量nxt(next)记录cur的下一个结点,之后我们就可以把cur的next指针指向pre,pre=cur,cur=nxt,如此循环,当反转结束后,pre指向反转这一段的末尾,cur指向反转这一段末尾的下一个结点,所以反转结束时,cur指向NULL,如图所示

 ListNode* reverseList(ListNode* head){
      ListNode* nxt;
      ListNode* pre=NULL;
      ListNode* cur=head;
      while(cur){
          nxt=cur->next;
          cur->next=pre;
          pre=cur;
          cur=nxt;
      }
      return pre;
    }

 1.2反转链表||

     做这道题我们要用到上一道题的性质:当反转结束后,pre指向反转这一段的末尾,cur指向反转这一段末尾的下一个结点。所以当翻转结束后cur指向5,pre指向4,所以我们要把2指向cur,1指向pre,这样就组成了14325,我们需要记录反转这一段的上一个结点p,所以就是把p的next指向cur,p指向pre,但是当left等于1时是没有p的,所以此时我们要建立一个虚拟头结点,代码如下

ListNode* reverseBetween(ListNode* head, int left, int right) {
        ListNode* dummyhead=new ListNode(0,head);
        ListNode* p=dummyhead;
         for (int i = 0; i < left - 1; ++i)
            p = p->next;

        ListNode *pre = NULL, *cur = p->next;
        for (int i = 0; i < right - left + 1; ++i) {
            ListNode *nxt = cur->next;
            cur->next = pre; 
            pre = cur;
            cur = nxt;
        }
        p->next->next = cur;
        p->next = pre;
        return dummyhead->next;
    }

1.3K个一组翻转链表

      这个要求我们k个结点一组进行翻转,所以我们要先求出来链表的长度,如果大于等于k时,我们要判断剩余结点的个数,小于k是无法翻转的,翻转的过程和上一题是一样的,需要注意的是我们额外要在翻转之后把p更新成下一段要翻转的链表的上一个结点,但是由于最后我们修改了p的next指针,所以我们需要在修改之前额外创建一个临时变量nxt=p->next,翻转结束后令p=nxt开始下一段循环,不断循环,最后返回dummyhead->next,代码如下:

 ListNode* reverseKGroup(ListNode* head, int k) {
         ListNode* head1=head;
         int len=0;
         while(head1)
         {
             len++;
             head1=head1->next;
         }
        ListNode* dummyhead=new ListNode(0,head);
        ListNode* p=dummyhead;
        ListNode *pre = NULL, *cur = p->next;
        for (; len>=k;len-=k ) {
            for(int i=0;i<k;i++){
            ListNode *nxt = cur->next;
            cur->next = pre; 
            pre = cur;
            cur = nxt;
            }
        
        ListNode* nxt=p->next;
        p->next->next = cur;
        p->next = pre;
        p=nxt;
}
        return dummyhead->next;
    }

2.链表删除

    我们要想删除链表的某个结点,需要利用上一个结点的next指针指向删除结点的下一个结点

2.1删除链表中的节点

 

     之前我们在基础数据结构讲过如何删除一个结点,但这个它不给我头结点,我怎么删除啊,这题就很秒,它说node不是链表的最后一个结点,也就是说我们可以把node结点的下一个结点的值复制过来,然后删除下一个结点,这可太妙了!

void deleteNode(ListNode* node) {
        node->val=node->next->val;
        node->next=node->next->next;
}

2.2 删除链表的倒数第N个结点

     第一种做法就是遍历求出链表长度,这样我们就知道要删除的倒数第N个结点是正数的第几个了,我们再遍历到这个结点的上一个结点执行删除操作,同时因为n可能等于链表长度,所以我们需要建立虚拟头结点,这样就OK了。

    第二种做法是快慢指针,我们需要找到倒数第N+1个结点,初始化右指针指向虚拟头结点,先让右指针走N步,然后初始化左指针指向虚拟头结点,左右指针一起向右移动,这样两个指针的距离始终为N,当右指针走向倒数第一个结点,左指针就恰好走到了倒数第N+1个结点,这时候就可以执行删除操作了!

ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode* dummyhead=new ListNode(0);
        dummyhead->next=head;
        ListNode* slow=dummyhead;
        ListNode* fast=dummyhead;
        while(n--&&fast!=NULL){
            fast=fast->next;
        }
        
        while(fast->next!=NULL){
            slow=slow->next;
            fast=fast->next;
        }
        slow->next=slow->next->next;
        return dummyhead->next;
    }

2.3删除排序链表中的重复元素

     这个题还是比较简单的,首先并不需要虚拟头结点,因为就算头结点的值和下一个结点的值相等,也会保留头结点,我们只需要遍历链表,如果cur的下一个结点的val值和cur的val值相等,我们就删除cur的下一个结点,需要注意的是循环条件是cur->next,当cur遍历到最后一个结点时,cur的下一个结点就不存在是NULL,此时应该退出循环,如果是cur则会继续进入循环造成NULL指针的解引用,会报错

    ListNode* deleteDuplicates(ListNode* head) {
        if(head==NULL)return NULL;
        ListNode* cur=head;
        while(cur->next)
        {
            if(cur->next->val==cur->val)
            {
                cur->next=cur->next->next;
            }
            else
            {
            cur=cur->next;
            }
        }
        return head;
    }

 2.4 删除排序链表中的重复元素||

     首先这个题需要建立虚拟头结点,因为如果开头就有几个重复的结点,那么头结点会被删除,所以我们先创建一个虚拟头结点,然后初始化cur指针指向虚拟头结点,然后遍历链表,每次遍历时,先取出cur的next的值val,如果cur的next的next的值和val相等,再进入循环判断cur的next的值是否等于val,相等就删除,否则移动到下一个结点,最后返回头结点

 ListNode* deleteDuplicates(ListNode* head) {
         ListNode* dummyhead=new ListNode(0);
         dummyhead->next=head;
         ListNode* cur=dummyhead;
         while(cur->next&&cur->next->next)
         {
            int val=cur->next->val;
            if(cur->next->next->val==val)
            {
                while(cur->next&&cur->next->val==val)
                {
                    cur->next=cur->next->next;
                }
            }
            else
            {
                cur=cur->next;
            }
         }
         return dummyhead->next;
    }

 

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

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

相关文章

Linux应用程序管理(rpm yum 源码安装)

一.Linux应用程序基础 当我们主机安装Linux操作系统时候&#xff0c;也会同时安装一些软件或网络服务等等&#xff0c;但是随着系统一起安装的软件包毕竟他是少数的&#xff0c;能够实现的功能也是有限的&#xff0c;如果需要实现更丰富的功能&#xff0c;那就需要安装应用程序…

vue2 el-table 行按钮过多,按钮超出指定个数,显示为下拉菜单(简单的自定义组件)01

vue2 el-table 行按钮过多&#xff0c;按钮超出指定个数&#xff0c;显示为下拉菜单&#xff08;简单的自定义组件01&#xff09; 上图 优化前 按钮太多不美观 优化后 默认展示三个按钮 超出显示下拉菜单 上代码 封装按钮组件 OperateBtn.vue // OperateBtn.vue<templ…

【Linux】归档和备份

简介 计算机系统管理员的一个主要任务就是保护系统的数据安全&#xff0c;其中一种方法是通过时时备份系 统文件&#xff0c;来保护数据。即使你不是一名系统管理员&#xff0c;也经常会处理大量文件&#xff0c;在这里我们看看常见的管理文件集合命令。 压缩命令&#xff1a…

2016年第五届数学建模国际赛小美赛A题臭氧消耗预测解题全过程文档及程序

2016年第五届数学建模国际赛小美赛 A题 臭氧消耗预测 原题再现&#xff1a; 臭氧消耗包括自1970年代后期以来观察到的若干现象&#xff1a;地球平流层&#xff08;臭氧层&#xff09;臭氧总量稳步下降&#xff0c;以及地球极地附近平流层臭氧&#xff08;称为臭氧空洞&#x…

十.MySQL数据类型精讲(二)

MySQL数据类型精讲 6.日期与时间类型6.1YEAR类型6.2DATE类型6.3TIME类型6.4DATETIME类型6.5TIMESTAMP类型6.6开发经验 7.文本字符串类型7.1CHAR与VARCHAR类型7.2TEXT类型 8.ENUM类型9.SET类型10.二进制字符串类型11.JSON类型12.空间类型13.小结及选择建议 6.日期与时间类型 日…

Gartner2023数据库魔力象限发布 阿里云依旧领导者 腾讯退出 EDB/Yugabyte进入

这是一个跨越数年的系列&#xff0c;历史文章参考&#xff1a; * 数据库魔力象限2022&#xff1a;阿里领先、腾讯再次进入 * 2021 藏在魔力象限中的数据库江湖 * Gartner云计算魔力象限2018 概述 Gartner云数据库魔力象限&#xff08;后简称“象限”或“MQ”&#xff09;一…

【数据结构之单链表】

数据结构学习笔记---003 数据结构之单链表1、什么是单链表?1.1、概念及结构 2、单链表接口的实现2.1、单链表的SList.h2.1.1、定义单链表的结点存储结构2.1.2、声明单链表各个接口的函数 2.2、单链表的SList.c2.2.1、遍历打印链表2.2.2、销毁单链表2.2.3、打印单链表元素2.2.4…

图数据库NebulaGraph学习

1.图空间(Space)操作 1.1创建图空间&#xff0c;指定vid_type为整形 CREATE SPACE play_space (partition_num 10, replica_factor 1, vid_type INT64) COMMENT "运动员库表空间"; 1.2创建图空间&#xff0c;指定vid_type为字符串 CREATE SPACE play_space (…

YOLOv8改进 | 主干篇 | 利用MobileNetV3替换Backbone(轻量化网络结构)

一、本文介绍 本文给大家带来的改进机制是MobileNetV3&#xff0c;其主要改进思想集中在结合硬件感知的网络架构搜索&#xff08;NAS&#xff09;和NetAdapt算法&#xff0c;以优化移动设备CPU上的性能。它采用了新颖的架构设计&#xff0c;包括反转残差结构和线性瓶颈层&…

Java小案例-聊一聊Java、Spring、Dubbo三者SPI机制的原理和区别

前言 什么是SPI&#xff1f; 什么是SPI SPI全称为Service Provider Interface&#xff0c;是一种动态替换发现的机制&#xff0c;一种解耦非常优秀的思想&#xff0c;SPI可以很灵活的让接口和实现分离&#xff0c;让api提供者只提供接口&#xff0c;第三方来实现&#xff0c…

软件工程中关键的图-----知识点总结

目录 1.数据流图 2.变换型设计和事务型设计 3.程序流程图 4.NS图和PAD图&#xff1a; 5.UML图 1.用例图 2.类图 3.顺序图 4.协作图 本文为个人复习资料&#xff0c;包含个人复习思路&#xff0c;多引用&#xff0c;也想和大家分享一下&#xff0c;希望大家不要介意~ …

CVE-2023-49898 Apache incubator-streampark 远程命令执行漏洞

项目介绍 Apache Flink 和 Apache Spark 被广泛用作下一代大数据流计算引擎。基于大量优秀经验结合最佳实践&#xff0c;我们将任务部署和运行时参数提取到配置文件中。这样&#xff0c;带有开箱即用连接器的易于使用的 RuntimeContext 将带来更轻松、更高效的任务开发体验。它…

【LeetCode刷题笔记】贪心

135.分发糖果 解题思路: 两个数组 + 两次遍历 ,取 最大峰值 ,准备两个数组 L 和 R ,默认填充 1 , 先 从左往右 扫描一遍, 更新 L 数组,如果 右边

评论回复功能数据库设计

1. 评论的场景 类似csdn博客评论 2. 建表sql CREATE TABLE comment (id varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT id,parent_id varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 父级评论id&#xff08;…

初识大数据,一文掌握大数据必备知识文集(3)

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

State of PostgreSQL 2023 报告解读

基于 PostgreSQL 内核的时序数据库厂商 Timescale 发布了一年一度的 State of Postgres 2023 报告。 Timescale 介绍 简单先介绍一下 Timescale 这家公司的历史。它最早是提供了一个 PG 的插件&#xff0c;引入了 Hypertable 这个概念&#xff0c;来高效地处理时序数据&…

Flappy Bird游戏python完整源码

通过pygame实现当年风靡一时的flappy bird小游戏。 当前只设定了同样长度的管道&#xff0c;图片和声音文件自行导入。 效果如下&#xff1a; # -*- coding:utf-8 -*- """ 通过pygame实现曾风靡一时的flappybird游戏。 小鸟x坐标不变&#xff0c;画布左移实现…

mac上使用 Downie 下载网页视频

在今天的数字时代&#xff0c;视频内容在互联网上的传播变得更加普遍和便捷。然而&#xff0c;有时我们可能希望将网页上的视频保存在本地&#xff0c;以便离线观看或与他人分享。Downie 是一款强大而简便的工具&#xff0c;专门设计用于下载网页上的视频内容。本文将介绍 Down…

阿里巴巴虚拟试衣间:在模特身上尝试任何服装 | 开源日报 No.122

HumanAIGC/OutfitAnyone Stars: 1.8k License: NOASSERTION Outfit Anyone 由阿里巴巴集团的智能计算研究院开发。它提供了超高质量的虚拟试衣功能&#xff0c;用户可以在模特身上尝试任何服装&#xff0c;并且保证安全和隐私。主要功能包括&#xff1a; 提供超高质量的虚拟试…

Qt通用属性工具:随心定义,随时可见(一)

一、开胃菜&#xff0c;没图我说个DIAO 先不BB&#xff0c;给大家上个效果图展示下&#xff1a; 上图我们也没干啥&#xff0c;几行代码&#xff1a; #include "widget.h" #include <QApplication> #include <QObject> #include "QtPropertyEdit…