链表的实际应用

news2024/9/29 8:55:44

1. 删除链表中等于给定值 val 的所有节点。

链接:203. 移除链表元素 - 力扣(Leetcode)

假设:我们有这么个链表:

我们需要删除所有date域为key的结点。

假设key为4:

 思路(快慢指针):

1. 我们设置两个指针,一个叫做fast,用于与date域进行判断;另一个叫做slow,用于将所有的链表串联。fast指向head.next;slow指向slow。

2. fast先走,判断date域中的的值和key的对比结果。如果结果为不相等,那么slow和fast一起向后走一步;

 如果结果相等:

将fast.next 赋给slow.next ,用于跳过这个指针。

 

继续向后走:

我们可以知道直到fast为null时,我们就结束了。 

3. 考虑特殊情况;1. 我们的fast是指向第二个结点的,可能只有单个结点;2. 我们的思路没有考虑头结点的date域为key的情况。

class Solution {
    public ListNode removeElements(ListNode head, int key) {
        if (head == null) {
            return null;
        }
        ListNode slow = head;
        ListNode fast = head.next;
        while(fast != null) {
            if(fast.date== key) {
                slow.next = fast.next;
            } else {
                slow = fast;
            }
            fast = fast.next;
        }
      
        return head;
    }
}

 我们还缺少一段代码:

 if(head.date== key) {
            head = head.next;
        }

对于这段代码放在哪里也需要考虑,如果放在循环之前,那么会有漏掉一个结点的情况,我们来测试一下。

假设key为2:

 判断head.date 是否与key相等,结果为真,那么

 我们新的head结点的date域还是2,这种情况下是不能解决问题的。

我们可以试着先不管head结点,把其他的结点全部排序好,最后再来处理head结点,所以我们可以把该段代码放在循环之后:

class Solution {
    public ListNode removeElements(ListNode head, int key) {
        if (head == null) {
            return null;
        }
        ListNode slow = head;
        ListNode fast = head.next;
        while(fast != null) {
            if(fast.date== key) {
                slow.next = fast.next;
            } else {
                slow = fast;
            }
            fast = fast.next;
        }
        if(head.date== key) {
            head = head.next;
        }
        return head;
    }
}

我们来看看结果如何:

 2. 反转一个单链表。

链接:206. 反转链表 - 力扣(Leetcode)

假设链表为:

我们的最终目的是变成: 

 我们的思路有很多,但是我们要求只遍历一遍就将链表翻转。

我们有一个最简单的思路,头变尾,尾变头:

将head结点的next变为null;

 

 将第二个结点变为新的head结点原来的head结点接到新的head结点,后面的所有结点也如此。

具体思路:

1. 先创建一个 cur 结点保存 head.next,再将head结点的next域置为null;

  2. 创建一个curNext结点,用于保存cur.next ;将head的地址保存到cur.next 中,

  3.  将cur赋给head,将curNext赋给cur:

4. 重复2 3 两步操作:

 直到cur 为 null。

 当然我们还需要考虑特殊情况如果head为null,那么直接返回null即可,如果只有head一个结点,那么我们返回head。

 代码如下:

class Solution {
    public ListNode reverseList(ListNode head) {
        if (head == null) {
            return null;
        }
        if (head.next == null) {
            return head;
        }
        ListNode cur = head.next;
        head.next = null;
        while (cur != null) {
            ListNode curNext = cur.next;
            cur.next = head;
            head = cur;
            cur = curNext;
        }
        return head;
    }
}

结果如下:

 3. 给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。

链接:876. 链表的中间结点 - 力扣(Leetcode)

这题很简单,分析如下:

设置两个指针,一个fast,一个slow,我们要找到中间结点,如果是单数比如5,我们的中间结点元素的下表应该为2,恰好为正中间。如果是双数,比如4,中间结点的下标为:4 / 2 = 2。

那么思路就有了:

快指针fast每次走2步,慢指针slow每次走1步,当fast走到末尾时slow正好走到中间。

代码:

class Solution {
    public ListNode middleNode(ListNode head) {
        ListNode prve = head;
        ListNode cur = head;
        while(prve != null && prve.next != null) {
            prve = prve.next.next;
            cur = cur.next;
        }
        return cur;
    }
}

结果:

我们这一题的目的是为了引出下一题:

输入一个链表,输出该链表中倒数第k个结点

4. 输入一个链表,输出该链表中倒数第k个结点

链接:链表中倒数第k个结点_牛客题霸_牛客网 (nowcoder.com)

在上一题的基础上,我们去找倒数第k个结点:

思路(快慢指针):

 我们先让fast跑到k-1步;为什么是走k-1步呢?我们找中间结点堆成,无论是单数结点,还是双数结点;比如4,找倒数第二个结点,fast先走1步,然后再fast和slow一起一步步走,fast走到最后一个,slow恰好走到目标结点。

因为与目标结点相对称的结点,恰好距离fast k - 1 步。

测试:假设上图中目标结点为倒数第二个结点:

fast先走2-1 步

 接下来fast和slow一起走:

 当fast走到末尾时,slow恰好走到目标结点:

 当然不能忘记特殊情况,如果k不合理或者,head为空时需要单独处理:

代码如下:

public class Solution {
    public ListNode FindKthToTail(ListNode head,int k) {
        if (k <= 0 || head == null ) {
            return null;
        }
        ListNode fast = head;
        ListNode slow = head;
        while (k - 1 != 0) {
            fast = fast.next;
            if(fast == null) {
                return null;
            }
            k--;
        }
        while (fast.next != null) {
            fast = fast.next;
            slow = slow.next;
        }
        return slow;
    }
}

 结果如下:

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

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

相关文章

54、反射(reflection)

一、入门 反射机制的重要性在于&#xff1a;通过外部文件配置&#xff0c;在不修改源码情况下来控制程序&#xff0c;也符合设计模式的ocp原则&#xff08;开闭原则&#xff1a;不修改源码&#xff0c;扩容功能&#xff09; package hspedu.reflection_question;import hsped…

你知道的都不对!Python应该这样学

你们所说的什么要怎样数据分析、爬虫、Web 等&#xff0c;在我看来那不是精通 Python&#xff0c;而是精通某一领域&#xff0c;抛开 Python 换用另一门语言也可&#xff0c;在我看来&#xff0c;精通 Python 语言大约需要如下这些步骤&#xff08;你有你的学习方法&#xff09…

SpringBoot-TwoDay

thymeleaf常用配置 server:port: 8096 spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3305/mybatis?useSSlfalseusername: rootpassword: rootthymeleaf:cache: false# 降低代码审查的严格度mode: LEGACYHTML5# 配置了前缀pref…

jsp+ssm计算机毕业设计宠物商店管理系统【附源码】

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JSPSSM mybatis Maven等等组成&#xff0c;B/S模式 Mave…

Docker笔记--搭建私有仓库、上传镜像、拉取镜像

目录 1--搭建私有仓库 2--将镜像上传到私有仓库 3--从私有仓库拉取镜像 4--补充测试 1--搭建私有仓库 ① 拉取私有仓库镜像 docker pull registry ② 启动私有仓库容器 docker run -id --nameregistry_test -p 5000:5000 registry ③ 打开浏览器&#xff0c;输入以下地址…

网络编程套接字 -- TCP/UDP

网络编程套接字 -- TCP/UDP一、网络编程1.1 什么是网络编程1.2 网络编程中的基本概念1.3 TCP和UDP二、UDP数据报套接字编程2.1 DatagramSocket API2.2 DatagramPacket API2.3 InetSocketAddress API2.4 回显程序 (UDP)2.5 翻译程序 (UDP)三、TCP流套接字编程3.1 ServerSocket A…

考研数学模拟卷经典题总结

考研数学模拟卷经典题总结1、李林四套卷的题目&#xff1a; 【23考研数学】李林老师四套卷两道二重积分计算题目分享——利用雅可比变换大大减少计算量与利用轮换对称性解题_哔哩哔哩_bilibili 上面两道题目都可以采用轮换对称性来做&#xff0c;第一道题目也可以使用雅可比行…

Java超市系统超市自提超市多商家系统源码超市自提网站

简介 Ssm多商家超市自提系统。用户注册申请开店成为商家&#xff0c;普通注册用户下单时选择离自己较近的自提点次日取货。管理员进行店铺审核、用户、分类管理等。 演示视频 https://www.bilibili.com/video/BV1hg411E77q/?share_sourcecopy_web&vd_sourceed0f04fbb7131…

Java老鸟5年压箱底面试真题资料+自学手册,秋招拿下阿里45k offer

背景 又逢“金三银四”&#xff0c;年轻的毕业生们满怀希望与忐忑&#xff0c;去寻找、竞争一个工作机会。已经在职的开发同学&#xff0c;也想通过社会招聘或者内推的时机争取到更好的待遇、更大的平台。然而&#xff0c;面试人群众多&#xff0c;技术市场却相对冷淡&#xf…

轻量日志收集系统loki

1.Loki简介 Loki是受Prometheus启发由Grafana Labs团队开源的水平可扩展&#xff0c;高度可用的多租户日志聚合系统。 开发语言: Google Go。它的设计具有很高的成本效益&#xff0c;并且易于操作。使用标签来作为索引&#xff0c;而不是对全文进行检索&#xff0c;也就是说&a…

基于帝国主义竞争算法(ICA)求解旅行商问题(TSP)(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维…

如何用Python破解邻居家的WIFI?

Hallo&#xff0c;各位小伙伴们大家好&#xff0c;这篇文章我们来干一件大事&#xff0c;如标题所示——用Python破解邻居家的WiFi。这是偶然间在码云上看到的一个项目&#xff0c;感觉蛮有趣的&#xff0c;分享给大家。文中用到的语料库和源码博主也会在文章最后贴给大家&…

Nginx教程(2)

文章目录2.1 Nginx解决跨域问题2.2 Nginx解决静态资源防盗链问题2.3 Nginx的模块化体系2.4 Nginx集群负载均衡2.5 四层负载均衡和七层负载均衡2.6 使用Nginx构建Tomcat集群2.1 Nginx解决跨域问题 所谓的跨域问题是指&#xff0c;比如我们现在我们访问域名www.imooc.com&#xf…

Linux从入门到进阶学习(Ⅳ):Linux实用操作

目录 1 实用技巧 2 软件安装 2.1 CentOs系统 2.2 Ubuntu系统 3 systemctl控制软件 4 软链接 5 日期和时区 5.1 查看日期 5.2 修改时区 5.3 时间校准 6 IP地址和主机名 6.1 IP地址与主机名 6.2 域名解析 7 固定IP地址 8 网络请求和下载 8.1 ping 8.2 wget 8.3…

2022 软件测试填空判断题【太原理工大学】

期末复习汇总&#xff0c;点这里&#xff01;https://blog.csdn.net/m0_52861684/category_12095266.html?spm1001.2014.3001.5482 目录 二、填空题 三、判断题 二、填空题 全是课本原话&#xff0c;不一定只填红色部分&#xff0c;可能下次就换了这句话的其它地方&#xff…

高比例风电电力系统储能运行及配置研究(pythonMatlab实现)

目录 1 概述 2 案例 3 Matlab实现 3.1 题目及分析 3.2 Matlab代码 4 七个题全部代码&#xff08;值得学习&#xff09; 1 概述 “碳中和”目标驱动下未来电力系统必将是高比例可再生能源电力系统&#xff0c;可再生能源输出功率强随机波动性导致系统运行中功率实时平…

比较器和浅谈深浅拷贝

比较器和浅谈深浅拷贝 文章目录比较器和浅谈深浅拷贝前言一.比较器方法一方法二二.深浅拷贝2.1 浅拷贝2.2 深拷贝2.3 总结前言 我们学习完接口以后&#xff0c;我在这里会介绍一个比较器的接口&#xff0c;至于他是来干嘛的&#xff0c;比较器顾名思义就是来比较的&#xff0c…

【安卓学习之常见问题】百度地图卫星地图精度不够

█ 【安卓学习之常见问题】百度地图卫星地图精度不够 █ 系列文章目录 提示&#xff1a;这里是收集了和文件分享有关的文章 【安卓学习之常见问题】android路径及文件问题 【安卓学习之常见问题】文件分享–文件不存在 【安卓学习之常见问题】自定义组件-刷新后跳到第一行 【…

修复 IDEA 使用 Gradle 构建出错时的乱码问题(maven项目转Gradle后乱码,并报“错误,找不到符号”)

在迁移一个基于 Maven 构建项目到基于 Gradle 进行构建, 迁移的过程中发现编译失败了, IDEA 的 Gradle build output 面板出现了许多方块型的乱码. 这样子&#xff1a; 解决步骤1&#xff1a; Step 1: 点击 IDEA 顶部菜单栏中的 HelpStep 2: 点击 Edit Custom VM OptionsStep…

天权信安catf1ag网络安全联合公开赛-AGCTFS战队 wp

文章目录webPOPEzloginFileuploadHistoryMISC简单隐写十位马CryptoEasyrsa疑惑ReverseCheckinPwnCheckinAngrweb POP 脚本 <?php class catf1ag1{ public $hzy; public $arr; public function __construct(){$this->hzy new catf1ag2;$this->arr [&apos;pp…