【OJ】牛客链表刷题

news2024/12/28 19:32:31

题目

  • 1. 链表分割
    • 1.1 题目分析
    • 1.2 代码
  • 2. 链表的回文结构
    • 2.1 题目分析
    • 2.2 代码

这里两道与链表有关的题目均来自牛客。

1. 链表分割

在这里插入图片描述

1.1 题目分析

因为这里代码不能选择用c语言写,所以选择用c++,因为c++兼容c。
题目要求分割链表,我们可以直接弄成两个带哨兵位的链表,这样插入时就不用判断链表里面有没有节点。

    head1=tail1=(ListNode*)malloc(sizeof(ListNode));
    head2=tail2=(ListNode*)malloc(sizeof(ListNode));

一个链表放小于x的节点,直接用尾插就能实现,

          if(cur->val<x)
           {
            tail1->next=cur;
            tail1=tail1->next;
           }

另一个链表放大于等于x的节点,也使用尾插入。

 else {
            tail2->next=cur;
            tail2=tail2->next;
           }

最后把两个链表连接就行,

tail1->next=head2->next;

连接之后不要忘记把链表2的尾节点置空tail2->next=NULL,返回没有哨兵位的头节点pHead=head1->next,而头节点是我们自己在做的时候申请的,不要忘记free

free(head1);
free(head2);

1.2 代码

class Partition {
  public:
    ListNode* partition(ListNode* pHead, int x) {
        // write code here
        ListNode* cur=pHead;
        ListNode* head1, *tail1,*head2,*tail2;
        head1=tail1=(ListNode*)malloc(sizeof(ListNode));
        head2=tail2=(ListNode*)malloc(sizeof(ListNode));
        while(cur)
        {
           if(cur->val<x)
           {
            tail1->next=cur;
            tail1=tail1->next;
           }
           else {
            tail2->next=cur;
            tail2=tail2->next;
           }
           cur=cur->next;
        }
        tail1->next=head2->next;
        tail2->next=NULL;
        pHead=head1->next;
        free(head1);
        free(head2);

        return pHead;
    }
};

在这里插入图片描述

2. 链表的回文结构

这里同样是不能选择用c语言写,所以选择用c++,因为c++兼容c。
在这里插入图片描述

2.1 题目分析

我们先搞清楚什么是回文结构,回文结构简单来说就是对称,看题目给的例子1 2 2 1,是不是就是第一个与最后一个是相等的,第二个与倒数第二个是相同的,题目这个给的是数为偶数的情况。为奇数也是一样的像1 2 3 2 1,也是一样的道理。
那么我们是不是就可以想到把原链表拆为两部分,把后边部分逆置一下,再与前半部分比较就行了。
这里得计算哪里开始是后半段,这里就得用到快慢指针,不管是奇数个还是偶数个,把中间位置的节点放在新链表中,最后与拆后的链表比较完,就算新链表还剩下一个,拆后的已经比较完了,就说明还是回文结构。
慢指针slow走一步,快指针走两步,当快指针fast走完或者快指针fast的next为空就结束,返回慢指针指向的位置。这里得重新写一个函数,返回慢指针。

       struct ListNode* MidNode(ListNode* A) {
        ListNode* slow = A, *fast = A;
        while (fast && fast->next) {
            slow = slow->next;
            fast = fast->next->next;
        }
        return slow;

    }

然后在新链表开始进行头插,返回新链表的头节点,也直接写一个

struct ListNode* NewList(struct ListNode* A) {

        ListNode* cur = A;
        ListNode* newhead;
        while (cur) {
            ListNode*next=cur->next;
        cur->next=newhead;
        newhead=cur;
        cur=next;

        }
        return newhead;
    }

再将新链表与拆了的链表进行比较。

       bool chkPalindrome(ListNode* A) {
       struct ListNode* mid=MidNode(A);
       struct ListNode* newhead=NewList(mid);
        while(A&&newhead)
        {
           if(A->val!=newhead->val)
               return false;
        
           A=A->next;
           newhead=newhead->next;

        }
        return true;

2.2 代码

class PalindromeList {
  public:
    struct ListNode* NewList(struct ListNode* A) {

        ListNode* cur = A;
        ListNode* newhead;
        while (cur) {
            ListNode*next=cur->next;
        cur->next=newhead;
        newhead=cur;
        cur=next;

        }
        return newhead;
    }
    struct ListNode* MidNode(ListNode* A) {
        ListNode* slow = A, *fast = A;
        while (fast && fast->next) {
            slow = slow->next;
            fast = fast->next->next;
        }
        return slow;

    }

    bool chkPalindrome(ListNode* A) {
       struct ListNode* mid=MidNode(A);
        struct ListNode* newhead=NewList(mid);
        while(A&&newhead)
        {
           if(A->val!=newhead->val)
               return false;
        
           A=A->next;
           newhead=newhead->next;

        }
        return true;
        // write code here
    }
};

在这里插入图片描述

有问题请指出,大家一起进步!

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

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

相关文章

【笔记】Helm-3 主题-6 Chart仓库指南

Chart仓库指南 本节介绍如何创建和使用chart仓库。在高层级中&#xff0c;chart仓库是打包的chart存储和分享的位置。 社区的Helm chart仓位于 Artifact Hub &#xff0c;欢迎加入。不过Helm也可以创建并运行您自己的chart仓库。该指南将介绍如何操作。 Artifact Hub 先决条…

威士忌的品鉴之旅麦芽制备:从浸泡、发芽到干燥

麦芽制备是威士忌酿造过程中至关重要的一环&#xff0c;它直接影响到产品的品质和风味。麦芽的制备包括浸泡、发芽、干燥等环节&#xff0c;每个环节都需要严格控制温度、湿度和时间等细节。本文将深入探讨麦芽制备的过程&#xff0c;以雷盛537威士忌&#xff0c;分析麦芽制作过…

4人遇难,北京突发火情 富维烟火识别防止悲剧再次发生

在北京一处居民区&#xff0c;一场突如其来的火灾夺走了四条宝贵的生命。火情迅速蔓延&#xff0c;烟雾弥漫&#xff0c;居民们猝不及防。这一悲剧再次提醒我们&#xff0c;火灾预防和早期识别的重要性不容忽视。 在这样的背景下&#xff0c;北京富维图像公司开发的FIS智能图像…

肯尼斯·里科《C和指针》第7章 函数(2)递归

7.5 递归 C通过运行时堆栈支持递归函数的实现。递归函数就是直接或间接调用自身的函数。许多教科书都把计算阶乘和斐波那契数列用来说明递归&#xff0c;这是非常不幸的。在第1个例子中&#xff0c;递归并没有提供任何优越之处。在第2个例子中&#xff0c;它的效率之低是非常恐…

中国多家半导体设备厂表现出色,营收可观 | 百能云芯

多家中国半导体设备大厂近日相继发布了2023年度业绩预告&#xff0c;表现出色&#xff0c;营收和净利润均呈现较大幅度的增长&#xff0c;这一利好消息背后得益于半导体行业周期的复苏以及国产半导体需求的持续增长。 据百能云芯电子元器件商城了解&#xff0c;北方华创发布的公…

域中的主机报错1231解决办法

1、 这个一般是使用 net view /domain 的时候出现的报错&#xff0c;若是报错 6118 只需在域控制器中开启 computer browser 服务即可 2、解决了 6118 问题后&#xff0c;在域控制器上已经能使用 net view /domain 了&#xff0c;但是域中的其它主机上会出现 1231 问题&#xf…

单臂路由【新华三与华为区别】

【技术介绍】单臂路由&#xff0c;简单来讲&#xff0c;就是在一个路由器的物理端口上虚拟几个虚拟端口&#xff0c;从而达到节约资源的效果 【背景】 R1上进行单臂路由 【操作】 【华为】 [HW-SWA] vlan batch 10 20 int g0/0/1 port link-type access port default vlan 10…

揭露欧拉骗局5.构建函数1/n>ln(1+1/n)公开作弊

构建函数又名构造函数&#xff0c;是欧系数学的重要解题方法。构建函数最成功的范例是“1/n&#xff1e;ln(11/n)”&#xff0c;它来自欧拉&#xff0c;其手段极其卑劣下作&#xff01;随心所欲、目空一切是欧拉的习惯 欧拉证明1/n&#xff1e;ln(11/n)的操作有两步&#xff1…

【陈老板赠书活动 - 22期】- 人工智能(第三版)

陈老老老板&#x1f9d9;‍♂️ &#x1f46e;‍♂️本文专栏&#xff1a;赠书活动专栏&#xff08;为大家争取的福利&#xff0c;免费送书&#xff09; &#x1f934;本文简述&#xff1a;活就像海洋,只有意志坚强的人,才能到达彼岸。 &#x1f473;‍♂️上一篇文章&#xff…

阿里云ack集群管理及故障处理

一、集群管理维护 二、常见故障处理 存储&#xff1a; 网络 弹性伸缩 service

头像空白问题

当用户没有设置头像时&#xff0c;我们可以使用用户名第一个字来当头像 主要涉及一个截取&#xff0c;截取字符串第一个字 变量名.charAt(0) 如果变量名为null或者undefine 那么就会报错 使用可选链操作符 &#xff1f; 当前面的值为nul或undefine时&#xff0c;就不会执行…

MySQL深度分页优化问题

☆* o(≧▽≦)o *☆嗨~我是小奥&#x1f379; &#x1f4c4;&#x1f4c4;&#x1f4c4;个人博客&#xff1a;小奥的博客 &#x1f4c4;&#x1f4c4;&#x1f4c4;CSDN&#xff1a;个人CSDN &#x1f4d9;&#x1f4d9;&#x1f4d9;Github&#xff1a;传送门 &#x1f4c5;&a…

JAVAEE初阶 文件IO(二)

文件IO 一. 文件流1.1 字节流 inputStream(1) try with resources方法 1.2 read方法(1) 第一个read方法(2) 第二个read方法(3) read的第三个方法 1.3 字节流 OutoutStream1.4 字符流(1) reader(2) writer 一. 文件流 1.1 字节流 inputStream 在字节流中,我们使用inputStream和…

1.18寒假集训

A: 解题思路&#xff1a; 这题看似很复杂&#xff0c;其实很简单&#xff0c;找规律不难发现就是输出n 1 下面是c代码&#xff1a; #include<iostream> using namespace std; int main() {int n;cin >> n;cout << n 1;return 0; } B: 解题思路&#xf…

QT-贪吃小游戏

QT-贪吃小游戏 一、演示效果二、关键程序三、下载链接 一、演示效果 二、关键程序 #include "Snake.h" #include "Food.h" #include "Stone.h" #include "Mushroom.h" #include "Ai.h" #include "Game.h" #inclu…

Python+selenium实现浏览器基本操作详解

关闭 driver 启动的浏览器 上一章节文末&#xff0c;我们介绍了关于两种关闭浏览器的方式&#xff0c;这里不做过多的复述。&#xff08;实在是这一章节的内容太少了&#xff09; 在 selenium 中&#xff0c;提供了两种关闭 driver 启动的浏览器的方式&#xff1a; close() 方…

掌握退款与测评自养号技术,在亚马逊、沃尔玛上轻松做卖家

今天&#xff0c;我想与大家分享在亚马逊、沃尔玛退款自养号中的一些经验。众所周知&#xff0c;自养号的环境是至关重要的&#xff0c;它涉及到系统的纯净度、下单所用的信用卡以及许多其他细节。一个良好的养号环境能够确保账号的安全与稳定&#xff0c;进而提高退款成功率。…

Android aar包集成与报错

Android Studio引用AAR的方式&#xff0c;分为gradle7.0之前与7.0之后 一、集成步骤 方法一&#xff1a; 1.将对应的xxx.aar包复制到项目的libs目录下&#xff08;xxx代表需要引入的aar包名称&#xff09; 2.然后在模块的build.gradle文件中配置implementation files(libs/lib…

C+关于用户界面设计

1.用户界面 用户界面&#xff08;User Interface&#xff0c;UI&#xff09;是用户与计算机程序、应用程序、设备或系统进行 交互的方式和元素的总称。它是用户与计算机系统之间的桥梁&#xff0c;通过它用户可以输入指 令、查看信息、执行操作等。用户界面的主要目标是使用户与…