链表OJ题+牛客题

news2025/1/19 3:13:14

目录

206.反转链表

876.链表的中间节点

链表中倒数第k个节点

CM11链表分割

OR36 链表的回文


206.反转链表

给你单链表的头节点head,请你反转链表,并返回反转后的链表。

 实现如下结果:

        

 思路:

取链表中的节点头插:

代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* reverseList(struct ListNode* head){
struct ListNode *cur=head;
struct ListNode *plist=NULL;
while(cur)
{
   struct ListNode *next=cur->next;
    
    cur->next=plist;//cur->next指向plist的地址
    
    plist=cur;          //plist 指向cur的地址,刚上面的一行代码和这一行代码使得链表的空间相连
    cur =next; 
}
return plist;
}/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* reverseList(struct ListNode* head){
struct ListNode *cur=head;
struct ListNode *plist=NULL;     //作为新的头节点
while(cur)
{
   struct ListNode *next=cur->next;     //记住cur的下一个节点
    
    cur->next=plist;//      头插
    
    plist=cur;          //换头
    cur =next;          //将原来cur->next节点的地址赋给cur
}
return plist;
}

876.链表的中间节点

给定一个头节点为head的非空单链表,返回链表的中间节点。如果有两个中间节点,则返回第二个中间节点。要求只能遍历一遍

思路:用快慢指针找到中间节点,定义两个结构体变量指针slow,fast。

slow每次走一步,fast每次走两步。当fast->next为空的时候,则链表长度为奇数,那么slow就是中间节点;当fast为空时,链表的长度为偶数,那么中间节点有两个,则返回第二个中间节点。

代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


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

链表中倒数第k个节点

输入一个链表,输出该链表中第k个节点

思路:定义结构体指针变量slow,fast,让fast先走k部,然后它们都各自每次向后走一步,当fast为空的时候,返回slow,此时slow就为链表中第k个节点。也可以让fast先走k-1步,当fast->next为空的时候,slow就是链表中第k个节点。

在这里需要注意的就是要注意k的值是否大于链表的长度,如果大于则返回NULL.

 代码:

struct ListNode*FindKthToTail(struct ListNode*pListHead,int k)
{
    struct ListNode*fast,slow;
    fast=slow=pListHead;
    while(k--)//让fast先走k步
    {
        //链表可能没有k步长
        if(fast==NULL)
        {
        return NULL;
        }
    fast=fast->next;
    }

    while(fast)//当fast为空
    {
    fast=fast->next;
    slow=slow->next;
    }
return slow;
}

CM11链表分割

描述:

现有一链表头指针为LinstNode* pHead,给一定值x,编写一段代码将所有小于x的节点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表头指针。

思路:

这道题用带哨兵位的链表求解,将所有小于x的节点尾插到第一个哨兵位节点后面;其余的尾插到第二个带哨兵位节点后面;最后将两个链表链接,返回第一个哨兵位节点后一个节点。

这里需要注意的是,在最后尾插结束时记得将第二个链表的尾节点的下一个节点置空(即上图的greaterTail的下一个节点置空),因为尾插结束,greaterTail->next还指向链表中的其他节点,如果不置空,会形成环。

 

代码: 

class Partition
{
    public:
ListNode *Partition(ListNode*pHead,int x)
{
    struct ListNode*lessHead,*lessTail;
    struct ListNode*greaterHead,*greaterTail;
    lessHead=lessTail=(struct ListNode*)malloc(sizeof(structListNode));
    greaterHead=greaterTail=(struct ListNode*)malloc(sizeof(struct ListNode));
    lessTail->next=greaterTail->next=NULL;

struct ListNode*cur=pHead;
while(cur)
{
    if(cur->val<x)
    {
        lessTail->next=cur;
        lessTail=lessTail->next;
    }
    else
    {
        greaterTail->next=cur;
        greterTail=greaterTail->next;
    }
    cur=cur->next;
}
lessTail->next=greaterHead->next;
greaterTail->next=NULL;

pHead=lessHead->next;
free(lessHead);
free(greaterHead);

return pHead;
}
}

OR36 链表的回文

描述:

对于一个链表,请设计时间复杂度为O(n),空间复杂度为O(1)的算法,判断其是否为回文结构。

给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900.

 思路:将链表的后半部分的节点逆置,再将前半部分的值和后半部分的值相比。因为额外的空间复杂度为O(1),所以不能整体逆置,整体逆置要重新开辟一个和原来一样长的链表空间。所以这里将后半部分的节点逆置之后就可以比较了。

代码:

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};*/
class PalindromeList {
public:
    struct ListNode* middle(struct ListNode* phead)  //返回中间值
    {
        struct ListNode*fast,*slow;
        fast=slow=phead;
        while(fast&&fast->next)
        {
            slow=slow->next;
            fast=fast->next->next;
        }
        return slow;
    }


struct ListNode*reverse(struct ListNode*phead)
{
    struct ListNode*cur=phead;
    struct ListNode*rehead=NULL;
    while(cur)
    {
        struct ListNode*next=cur->next;
        //头插
        cur->next=rehead;
        rehead=cur;


        cur=next;
    }
    return rehead;
}


    bool chkPalindrome(ListNode* A)
     {
         struct ListNode*mid=middle(A);
        struct ListNode*rehead=reverse(mid);
        while(A && rehead)
        {
            if(A->val!=rehead->val)
            return false;
            A=A->next;
            rehead=rehead->next;
        }


        return true;
        // write code here
    }
};

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

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

相关文章

操作系统的奋斗(二)

第二章 进程与线程2.1进程与线程2.1.1进程的概念、特征、状态与转换2.1.2进程的组织、控制、通信2.1.3进程和多线程模型2.2处理机调度2.2.1调度的概念、目标、实现2.2.2典型的调度算法2.2.3进程切换2.3同步与互斥2.3.1同步与互斥的基本概念2.3.2实现临界区互斥的基本办法2.3.3互…

IPv6与VoIP——配置Cisco CME实现VoIP实验

作者简介&#xff1a;一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.配置Cisco CME实现VoIP 1.实验环境 2.需要设备 Cisco P Co…

解决TypeError: type complex doesn‘t define __round__ method

在调整学习率的时候遇到的一个bug&#xff0c;现已解决。 首先看这个bug说的是&#xff1a;类型complex&#xff08;复数:ij&#xff09;类型不能使用round函数。 为啥不能使用呢&#xff1a; round函数是四舍五入&#xff0c;round(lr,10)就是取lr四舍五入后十位。而复数不能…

分享一套宾馆客房管理系统源码,功能完善,代码完整

淘源码&#xff1a;国内专业的免费源码下载平台 需要源码学习可私信 基本介绍&#xff1a; 本宾馆管理系统是一套成熟的客房管理软件,综合了国内多家同行业软件的优点。具有操作简单、功能全面。 适用于酒店、宾馆、招待所等提供住宿服务的企业。 功能简介&#xff1a; 包括入…

文献学习02_A Survey on Deep Learning for Named Entity Recognition_20221121

论文信息 Subjects: Computation and Language (cs.CL) &#xff08;1&#xff09;题目&#xff1a;A Survey on Deep Learning for Named Entity Recognition &#xff08;命名实体识别的深度学习研究综述&#xff09; &#xff08;2&#xff09;文章下载地址&#xff1a;ht…

私域流量对企业的好处

互联网商业人群在这种时代里&#xff0c;不断寻求突破&#xff0c;开拓创新&#xff0c;很好的将线上和线下结合起来&#xff0c;其中涌现了很多“互联网”模式以及一些新的概念。 比如社交电商、社群零售、私域流量等。这些新互联网商业概念&#xff0c;催生了很多大型企业&…

公众号免费网课查题方法

公众号免费网课查题方法 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 题库&#xff1a;题库后台&#xff08;点击跳转&#xf…

charles抓包配置具体操作步骤

Charles主要功能 截取Http和Https网络封包 支持重发网络请求&#xff0c;方便后端调试 支持修改网络请求参数 支持网络请求的截获并动态修改 支持模拟慢速网络 Charles下载安装 charles下载地址&#xff1a;https://www.charlesproxy.com/download/ 注&#xff1a; 浏览…

匹配系统(下)

创建SpringCloud目录 目录 创建SpringCloud目录 创建我们的两个子项目 实现两个Interface Config网关 放行完事两个Api 封装后端逻辑 对接我们的匹配系统 修改数据库-天梯分 更改数据库对应的一些修改 实现我们匹配之后的逻辑的思路 具体实现过程 关于线程锁 来进…

【扩展阅读之编译和解释语言的区别】

扩展阅读之编译和解释语言的区别1 本节目标2 解释型语言和编译型语言3 标识符、关键字、保留字1 本节目标 知道解释型语言和编译型语言的特点知道标识符不能是关键字或保留字 2 解释型语言和编译型语言 程序语言翻译成机器语言的工具被称为翻译器。翻译器翻译的方式有两种&a…

# 自用集群搭建Cluster

Redis集群 MySQL集群 Zookeeper集群 server.1192.168.81.133:2881:3881 server.2192.168.81.133:2882:3882 server.3192.168.81.133:2883:3883 $ cd …/zkdata $ touch myid $ echo “1”>>myid echo “2”>>myid echo “3”>>myid vim zoo.cfg dataDi…

Windows操作系统 | CMD命令行查看当前用户名

文章目录概述一、定义介绍二、操作教程(一)、方法一&#xff1a;net命令查看(二)、方法二&#xff1a;echo命令查看概述 本节详细介绍在Windows操作系统下使用cmd命令查看当前的用户名 一、定义介绍 使用cmd命令查看windows系统的当前用户名。共有两种办法&#xff0c;一是自带…

swift枚举(一)

OC中的枚举 typedef NS_ENUM(NSUInteger, IFLEnum) {A, B, C}A,B, C分别默认代表0&#xff0c; 1&#xff0c; 2 关键字enum 声明枚举 而swift中的枚举则更加灵活&#xff0c;并且不需要给枚举中的每一个成员都提供值 enum IFLEnum {case onecase twocase three}let mEnum: I…

Omorn - NJ301-1100 AND NX102-9000 - Socket - TCP 通讯

目录 Omorn - NJ301-1100 AND NX102-9000 - Socket - TCP 通讯 测试案例IP 通讯验证 Omorn - NJ301-1100 AND NX102-9000 - Socket - UDP 通讯 测试案例IP 通讯验证 Omorn - NJ301-1100 AND NX102-9000 - Socket - TCP 通讯 说明&#xff1a; Socket通讯需要双方约定好…

【正点原子FPGA连载】 第四章Vivado软件的安装和使用 摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0

1&#xff09;实验平台&#xff1a;正点原子MPSoC开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id692450874670 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第四章Vivado软件…

Design Compiler工具学习笔记(3)

目录 引言 知识储备 时钟创建 时钟偏差 时钟延迟 转换时间 输入路径约束 输出路径延迟 组合逻辑路径约束 时间预算 寄存器输出 总结 实际操作 设计文件 check_design reset_design 时序约束 check_timing compile report_constraint -all_violators remove_des…

conda创建虚拟环境命令、jupyter notebook启动打开和使用

一、conda创建虚拟环境命令步骤 1.1创建虚拟环境命令 首先使用conda -V命令检查是否已安装Anaconda&#xff0c;这里安装步骤省略 打开终端运行以下前两个命令&#xff0c;即可创建 1.创建名为env-name的虚拟环境&#xff1a;conda create --name [env-name] 2.进入env-n…

5个月的精华:Spring/SpringBoot扩展点手册:手册在手,编码无忧:全网独一份 - 第451篇

历史文章&#xff08;文章累计450&#xff09; 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 利用Spring扩展点模拟Feign实现远程调用…

使用Cpolar+freekan源码 创建在线视频网站

文章目录1.前言2.本地网页搭建1.1 环境使用1.2 支持组件和环境设置1.3 支持组件选和环境设置1.4 网页安装1.5 测试和使用1.6 问题解决3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置4.公网访问测试5.结语1.前言 随着网络条件的改善和移动智能设备的普及&#xff0c;在线…

C++语法——右值引用、移动构造和赋值、万能引用和转发、move和forward底层实现

目录 一.右值引用 &#xff08;一&#xff09;.何为右值 &#xff08;二&#xff09;.右值引用 &#xff08;三&#xff09;.右值和左值的互相传递 ①左值->右值引用 ②右值->左值引用 &#xff08;四&#xff09;.右值引用的自身属性 二.移动构造和移动赋值 &…