单链表在线OJ题(详解+图解)

news2024/11/17 7:17:07
1.删除链表中等于给定值 val 的所有节点

在这里插入图片描述
本题的要求是输入一个val的整形值,若链表中节点存储的值与val相等,则删除这个节点,并最后返回这个删除节点后的链表,思路如下:
在这里插入图片描述
我们可以直接使用while循环,并且使用双指针的方法,当这个当前节点的值与value相等时,我们就可以使用我们存储的prev(也就是cur前面一个节点)来删除当前cur节点,令prev的next等于cur的next,同时cur也要记得往后移动,while循环的终止条件就是当cur为空时就不进去,此时prev就时链表的尾节点,函数最终返回的依然是head节点
代码如下:
当head不为空时,且head所存放的值和val相等时,就直接可以将head往后移动

struct ListNode* removeElements(struct ListNode* head, int val)
{
  while (NULL != head && head->val == val)
  {
      head = head->next;
  }
  struct ListNode* curr=head;
  struct ListNode* prev=NULL;
  while(curr!=NULL)
  {
      if(curr->val!=val)
      {
          prev=curr;
      }
      else
      {
          prev->next=curr->next;
      }
      curr=curr->next; 
  }
  return head;
}
2.反转一个单链表

在这里插入图片描述
本题的意思很简单,就是将其反转:
我们要将链表反转,就是说将链表的“箭头”反过来
在这里插入图片描述
所以,到这里我们可以用while循环和两个指针来解决问题,首先将cur定位head位置(也就是第一个节点),同时prev是为空的,我们首先将节点1的next置为NULL,然后就是将2的next置为1节点所以我们在循环里要再cur移动之前就将2节点的指针存储好,我们将其定为next(cur->next),将1的next置为prev后,然后将prev置为cur,我们还要将cur往后移动,直接令cur=next,这样才能保证prev时cur的前一个节点,最后返回prev,prev就是最后一个节点,反转后的第一个节点
在这里插入图片描述

struct ListNode* reverseList(struct ListNode* head)
{
    struct ListNode* prev=NULL;
    struct ListNode* cur=head;
    while(cur)
    {
        struct ListNode* next=cur->next;
        cur->next=prev;
        prev=cur;
        cur=next;
    }
    return prev;
}
3.给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点

在这里插入图片描述
这种题目我们首先可以想到的就是快慢指针,我们定义两个指针,一个位slow,一个位fast,slow一次走一步,fast一次走两步,直到fast或者fast的next为空时就不能走了,slow的位置就是链表的中间节点了,因为fast走的距离就是slow的二倍
在这里插入图片描述

代码如下:

struct ListNode* middleNode(struct ListNode* head)
{
    struct ListNode* slow=head;
    struct ListNode* fast=head;
    while(fast&&fast->next)
    {
        slow=slow->next;
        fast=fast->next->next;
    }
    return slow;
}
4.输入一个链表,输出该链表中倒数第k个结点

在这里插入图片描述
这一题我们同样可以用快慢指针的方式来解决,我们先让fast指针先走k步,然后 fast和slow再一起一次走一步,最后当fast为空时,slow就是倒数第k个节点了
在这里插入图片描述

代码如下:

struct ListNode* FindKthToTail(struct ListNode* pListHead, int k )
{
    struct ListNode* slow=pListHead;
    struct ListNode* fast=pListHead;
    while(k--)
    {
        if(fast==NULL)
            return NULL;
        fast=fast->next;
    }
    while(fast)
    {
        slow=slow->next;
        fast=fast->next;   
    }
    return slow;
}
5.将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的

在这里插入图片描述
合并两个有序链表为一个有序链表,之前顺序表我们做过一个类似的题目,这里我们可以首先考虑两种简单的情况:当链表1或者链表2分别为空时,返回非空的那个即可,当两个同时为空时,直接返回空。
然后我们就 开始比较两个链表的第一个节点的值的大小,取较小的那个节点所属的链表为新链表的第一个节点和尾节点,然后再将两个链表的值进行比较,较小的一个节点就首先放在tail的next位置,然后将tail移动到较小的这个节点,同时较小节点的list=list->next
代码如下:

struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2)
{
    struct ListNode* head=NULL;
    struct ListNode* tail=NULL;
    if(list1==NULL)
    {
        return list2;
    }
    if(list2==NULL)
    {
        return list1;
    }
    while(list1&&list2)
    {
        
        if(list1->val<list2->val)
        {
            if(tail==NULL)
            {
                head=tail=list1;
            }
            else
            {
                tail->next=list1;
                tail=tail->next;
            }
            list1=list1->next;
        }
        else
        {
            if(tail==NULL)
            {
                head=tail=list2;
            }
            else
            {
                tail->next=list2;
                tail=tail->next;
            }
            list2=list2->next;
        }
    }
        if(list1)//list2遍历完成,list1遍历没完成,就直接把list2直接接上去
        {
            tail->next=list1;
        }
        if(list2)
        {
            tail->next=list2;
        }
    return head;
}
6.编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前

在这里插入图片描述
本题我们可以首先申请一个小于x的链表的空间存储小于x的节点 ,另外 申请一个大于x的链表,然后再将首节点置为小于x链表的首节点,将小于x链表的尾节点和大于x的链表的首节点链接,最后返回首节点即可
代码如下:

ListNode* partition(ListNode* pHead, int x) 
    {
        //大于等于x的尾插到一个列表,小于x的尾插到另一个列表
        struct ListNode* lesshead,*lesstail,*greaterhead,*greatertail;
        lesshead=lesstail=(struct ListNode*)malloc(sizeof(struct ListNode));
        greaterhead=greatertail=(struct ListNode*)malloc(sizeof(struct ListNode));
        struct ListNode* cur=pHead;
        while(cur)
        {
            if(cur->val<x)
            {
                lesstail->next=cur;
                lesstail=lesstail->next;
            }
            else 
            {
                greatertail->next=cur;
                greatertail=greatertail->next;
            }
            cur=cur->next;
        }
        //注意:这里用到了哨兵位,也就是说,两个链表的头节点都没有存储有效的数据
        lesstail->next=greaterhead->next;
        greatertail->next=NULL;
        pHead=lesshead->next;
        free(lesshead);
        free(greaterhead);

        return pHead;
    }
7.链表的回文结构

在这里插入图片描述
本题我们就要将链表一分为二了,然后再用循环进行比较,如果出现不相等,就直接返回false,否则返回true,若链表为空直接返回 false,我们用快慢指针,fast一次走两步,slow一次走一步,然后将slow前的节点所组成的链表进行反转,与slow后节点的链表进行比较即可
在这里插入图片描述

代码如下:

    bool chkPalindrome(ListNode* A) 
    {
        if(A==NULL)
            return false;
        ListNode* slow=A,*fast=A;
        while(fast && fast->next)
        {
            slow=slow->next;
            fast=fast->next->next;
        }
        ListNode* cur=NULL,*next=slow;
        while(slow)
        {
            next=slow->next;
            slow->next=cur;
            cur=slow;
            slow=next;
        }
        next=A;
        while(cur)
        {
            if(next->val!=cur->val)
                return false;
            next=next->next;
            cur=cur->next;
        }
        return true;
    }

好了,今天的分享到这里就结束了,谢谢大家的支持!

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

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

相关文章

Python 如何实现职责链设计模式?什么是职责链设计模式?Python 职责链设计模式示例代码

什么是职责链&#xff08;Chain of Responsibility&#xff09;设计模式&#xff1f; 职责链&#xff08;Chain of Responsibility&#xff09;设计模式是一种行为型设计模式&#xff0c;旨在构建一个对象链&#xff0c;每个对象都有机会处理请求&#xff0c;并且可以将请求传…

基于stm32移植使用u8g2 库

前言 前面我已经写了如何使用stm32 使用软件IIC的方法驱动OLED&#xff0c;但是其实我们可以有更简单的使用方法&#xff0c;对于SSD1306 这款OLED 显示屏来说&#xff0c;其实已经有开源库可以直接使用了&#xff0c;我们只需要将对应的库移植过来&#xff0c;做一些简单的修改…

单片机课程设计——基于C51电子密码锁(源代码)

本设计是基于AT89C51单片机的电子密码锁设计&#xff0c;实现电子密码锁的基本功能。我们这里实现的是硬件仿真&#xff0c;关于软件仿真可以参考其他人的文章。 单片机课程设计--基于C51电子密码锁 效果展示 我们先来看效果展示&#xff0c;公主王子请看视频&#xff1a; 课…

【Spring总结】注解开发

本篇讲的内容主要是基于Spring v2.5的注解来完成bean的定义 之前都是使用纯配置的方式来定义的bean 文章目录 前言1. Spring v2.5 注解开发定义bean第一步&#xff1a;在需要定义的类上写上注解Component第二步&#xff1a;在Spring Config中定义扫描包第三步&#xff1a;主方法…

java springboot 在测试类中声明临时Bean对象

上文 java springboot在当前测试类中添加临时属性 不影响application和其他范围 中 我们讲了怎么在测试类中设置临时属性 但是 如果我们想设置临时的Bean呢&#xff1f; 其实做过几个项目的人都会理解 我们很多功能 需要一些第三方bean才能完成 那么 我们可能存在需要用第三方b…

图书管理系统(图文详解,附源码)

前言&#xff1a;本文旨在用面向对象的思想编程实现图书管理系统&#xff0c;功能包括增删查找&#xff0c;完整源码放在文末&#xff0c;大家有需自取 目录 一.整体框架 二.书籍和书架 书籍(Book) 书架(BookRack) 三.对书籍的相关操作 操作接口(IOperation) 新增图书(A…

项目点使用Redis作为缓存技术-自用

在spring boot项目中&#xff0c;使用缓存技术只需在项目中导入相关缓存技术的依赖包&#xff0c;并在启动类上使用EnableCaching开启缓存支持即可。 例如&#xff0c;使用Redis作为缓存技术&#xff0c;只需要导入Spring data Redis的maven坐标即可。 描述 使用Redis缓存高频数…

WSA子系统(一)

WSA子系统安装教程 Windows Subsystem for Android (WSA) 是微软推出的一项功能&#xff0c;它允许用户在 Windows 11 上运行 Android 应用程序。通过在 Windows 11 上引入 WSA&#xff0c;用户可以在其 PC 上轻松运行 Android 应用程序&#xff0c;从而扩展了用户的应用程序选…

RobotFramework之用例执行时添加命令行参数(十三)

学习目录 引言 标签tag 设置变量 随机执行顺序 设置监听器 输出日志目录和文件 引言 Robot Framework 提供了许多命令行选项&#xff0c;可用于控制测试用例的执行方式以及生成的输出。本节介绍一些常用的选项语法。 标签tag 之前文章我们介绍过&#xff0c;在测试套件…

Leetcode经典题目之“双指针交换元素“类题目

1 LC 27. 移除元素 class Solution {public int removeElement(int[] nums, int val) {int nnums.length;int s0;for(int i0;i<n;i){// 只有不等于目标值的时候才会进行交换&#xff0c;然后移动s指针if(nums[i]!val){swap(nums,i,s);}}return s;}void swap(int[]nums, int…

(数据结构)算法的时间复杂度

注意语句频度和时间复杂度的区别&#xff0c;语句频度是指语句执行的次数&#xff0c;不可以像时间复杂度一样近似次数和省略常数项

在线识别二维码工具

具体请前往&#xff1a;在线二维码识别解码工具--在线识别并解码二维码网址等内容

FlinkCDC数据实时同步Mysql到ES

考大家一个问题&#xff0c;如果想要把数据库的数据同步到别的地方,比如es,mongodb,大家会采用哪些方案呢&#xff1f; ::: 定时扫描同步&#xff1f; 实时日志同步? 定时同步是一个很好的方案&#xff0c;比较简单&#xff0c;但是如果对实时要求比较高的话&#xff0c;定…

HFSS螺旋线圈的设计与仿真

HFSS螺旋线圈的设计与仿真 HFSS中设计螺旋线圈的方法&#xff1a;参考文献&#xff1a; HFSS中设计螺旋线圈的方法&#xff1a; 打开软件Ansys Eletronics Desktop 2022 R1&#xff0c; 建立工程&#xff0c; File/New 插入HFSS设计&#xff0c; Project/Insert HFSS Design …

【Spring】之初识

未来的几周时间&#xff0c;大概率我会更新一下Spring家族的一些简单知识。而什么是Spring家族&#xff0c;好多同学还不是很清楚&#xff0c;我先来简单介绍一下吧&#xff1a; 所谓Spring家族&#xff0c;它其实就是一个框架&#xff0c;是基于Servlet再次进行封装的内容。为…

大模型的交互能力

摘要&#xff1a; 基础大模型显示出明显的潜力&#xff0c;可以改变AI系统的开发人员和用户体验&#xff1a;基础模型降低了原型设计和构建AI应用程序的难度阈值&#xff0c;因为它们在适应方面的样本效率&#xff0c;并提高了新用户交互的上限&#xff0c;因为它们的多模式和生…

笔记55:长短期记忆网络 LSTM

本地笔记地址&#xff1a;D:\work_file\DeepLearning_Learning\03_个人笔记\3.循环神经网络\第9章&#xff1a;动手学深度学习~现代循环神经网络 a a a a a a a a a

jbase打印完善

上一篇实现了粗略的打印元素绘制协议&#xff0c;并且写了打印示例和导出示例&#xff0c;趁着空隙时间完善一下打印。 首先元素构造函数默认初始化每个字段值 package LIS.Core.Dto;/*** 打印约定元素*/ public class PrintElement {/*** 元素类型*/public String PrintType…

OpenCV快速入门:图像形态学操作

文章目录 前言一、图像形态学基础1.1 背景介绍1.2 像素距离1.2.1 什么是像素距离&#xff1f;1.2.2 常见的像素距离度量方法1.2.3 计算像素距离的代码实现 1.3 图像连通性1.3.1 什么是图像连通性&#xff1f;1.3.2 连通类型1.3.3 连通组件标记1.3.4 连通性在图像处理中的应用 1…

2023.11.18 每日一题(AI自生成应用)【C++】【Python】【Java】【Go】 动态时间序列分析

目录 一、编程挑战&#xff1a;动态时间序列分析 实际应用&#xff1a; 实现提示&#xff1a; 二、实现 1. C 2. Python 3. JAVA 4. Go 一、编程挑战&#xff1a;动态时间序列分析 问题描述&#xff1a; 假设你是一名软件工程师&#xff0c;需要开发一个应用来分析和预…