链表刷题(4~8)

news2024/11/15 23:33:55

目录

反转链表

 返回中间节点

 倒数k个节点

 链表分割

 判断回文


反转链表

单链表刷题时我们遇到过一个反转链表,那时我们采用的是头插的方式达到反转的效果,那能不能把指针反过来呢?答案是可以的。

  

这里用三个指针是为了记录后面节点的数据,不然就导致后面的地址缺失,毕竟逻辑结构可不同于物理结构。可以看到结束条件是n2遍历到空就停止。

基于前面刷题的反转链表,现在我们除了头插外有一种新的办法:

力扣

struct ListNode* reverseList(struct ListNode* head)
{
    if(head == NULL)//防止空指针解引用
    {
        return NULL;
    }
    struct ListNode* n1,*n2,*n3;
    n1 = NULL;
    n2 = head;
    n3 = n2->next;
    while(n2)//结束条件
    {
        n2->next = n1;
        n1 = n2;
        n2 = n3;
        if(n3)//n3为空时保持原样
        {
            n3 = n3->next;
        }
    }
    return n1;
}

 返回中间节点

力扣

查找链表的中间节点有一个思想就是快慢指针slow指针每走一步,fast指针就走两步。这样做只遍历了一遍链表就找到了中间节点。

struct ListNode* middleNode(struct ListNode* head)
{
    struct ListNode* fast=head,*slow = head;
    while(fast && fast->next)
    {
        fast = fast ->next->next;
        //fast更新后判断,返回第一个中间结点:if(fast!=NULL)
        slow = slow->next;
    }
    return slow;//快慢指针

}

 倒数k个节点

链表中倒数最后k个结点_牛客题霸_牛客网

这道题与前一道题类似,不同的是不知道k为多长,为此,我们可以设置快慢指针让fast先走k步或k-1步,然后两个指针共同移动

需要注意不足k步时返回空链表

truct ListNode* FindKthToTail(struct ListNode* pHead, int k ) {
    struct ListNode* slow,*fast;
    slow = fast = pHead;
    while(k--)//k步
    {
        if(fast == NULL)//不足k步
        {
                return NULL;
        }
        fast = fast->next;
    }
    while(fast)//走k步结束条件
    {
        slow = slow->next;
        fast = fast->next;
    }
    return slow;
}

 链表分割

 这个题目算是比较难的题,它要求分割后的相对顺序不能改变。这里我们建立两个链表

一个记录比x小的数据,一个记录相等和比它大的数据,依次进行尾插。最后将两个链表相连。新的链表我们都创建一个哨兵节点(为了避免初始判空和其中一个链表为空的情况进行处理。)

  

这个图我画的比较乱,但思路却很明确。创建哨兵节点,比较,插入,置空,连结,释放,一气呵成。

这里不支持用C实现,我们就先用C++实现。这里的差别在于结构体定义可以不写struct。

class Partition {
public:
    ListNode* partition(ListNode* pHead, int x) {
        ListNode *greaterhead,*greatertail;
        greaterhead=greatertail=(ListNode *)malloc(sizeof(ListNode));
        ListNode *smallerhead, *smallertail;
        smallertail=smallerhead=(ListNode *)malloc(sizeof(ListNode));
    while(pHead==NULL)
    {
        return NULL;
    }
     ListNode* cur = pHead;
    while(cur)
   { if(cur->val<x)
    {
        smallertail->next = cur;
        smallertail =  smallertail->next;
    }
    if(cur->val>=x)
     {
        greatertail->next = cur;
        greatertail = greatertail->next;
    }
     cur = cur->next;
   }
   smallertail->next = greaterhead->next;//连结
   greatertail->next = NULL;//置空
    ListNode*Next = smallerhead->next;//返回
   free(smallerhead);
   free(greaterhead);
   return Next;
    }

};

可能很多人不理解为什么只对哨兵位开辟空间,这里是创建了两个新链表。其他数据虽然不是在堆上开辟但通过返回Next也能达到找到链表的作用。

 判断回文

 正常思路是复制一份链表,然后再此基础上进行反转。但这样的空间复杂度就变成了O(N)。这里介绍一种新奇的方法:根据回文的对称性,反转链表中间及以后的节点。

  

上面两种情况,比较结束条件为一方为空停止比较。

恰好我们实现了查找中间节点和反转链表,所以这里我们可以直接拷贝一份代码。

struct ListNode* reverseList(struct ListNode* head) {
    if (head == NULL) { //防止空指针解引用
        return NULL;
    }
    struct ListNode* n1, *n2, *n3;
    n1 = NULL;
    n2 = head;
    n3 = n2->next;
    while (n2) { //结束条件
        n2->next = n1;
        n1 = n2;
        n2 = n3;
        if (n3) { //n3为空时保持原样
            n3 = n3->next;
        }
    }
    return n1;
}
struct ListNode* middleNode(struct ListNode* head) {
    struct ListNode* fast = head, *slow = head;
    while (fast && fast->next) {
        fast = fast ->next->next;
        //fast更新后判断,返回第一个中间结点:if(fast!=NULL)
        slow = slow->next;
    }
    return slow;//快慢指针

}
class PalindromeList {
public:
    bool chkPalindrome(ListNode* A) {
        struct ListNode* mid = middleNode(A);
    struct ListNode* rhead = reverseList(mid);
    while(A && rhead)//一方为空停止
    {
       if( A->val != rhead->val)
       {
        return false;
       }
       A = A->next;
       rhead = rhead->next;
    }
    return true;
    }
};

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

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

相关文章

SpringBoot+Vue 的智慧养老系统(Java 项目,附源码,数据库)

作者&#xff1a;程序员徐师兄 个人简介&#xff1a;7 年大厂程序员经历&#xff0c;擅长Java、微信小程序、Python、Android等&#xff0c;大家有这一块的问题可以一起交流&#xff01; 各类成品java毕设 。javaweb&#xff0c;ssh&#xff0c;ssm&#xff0c;springboot等等项…

Jira 8.4.1在Windows环境下的安装和配置

一. Jira安装的环境准备 1.JDK1.8的下载和安装 Jira的运行是依赖java环境的&#xff0c;也就是说需要安装JDK并且要是1.8以上版本。(网上搜一下教程) 2.MySQL数据库的下载和安装(网上搜一下教程) 数据库版本&#xff1a;MySQL5.6&#xff0c;版本太高有时会出现连接不到的…

从双目标定到立体匹配:pyton实践指南

文章目录 前言标定立体匹配文章已经同步更新在3D视觉工坊啦&#xff0c;原文链接如下&#xff1a; 前言 立体匹配是计算机视觉中的一个重要领域&#xff0c;旨在将从不同角度拍摄的图像匹配起来&#xff0c;以创建类似人类视觉的3D效果。实现立体匹配的过程需要涉及许多步骤&a…

华为OD机试真题B卷 Java 实现【统计每个月兔子的总数】,附详细解题思路

一、题目描述 有一种兔子&#xff0c;从出生后第3个月起每个月都生一只兔子&#xff0c;小兔子长到第三个月后每个月又生一只兔子。 例如&#xff1a;假设一只兔子第3个月出生&#xff0c;那么它第5个月开始会每个月生一只兔子。 一月的时候有一只兔子&#xff0c;假如兔子都…

dvwa靶场通关(七)

第七关&#xff1a;SQL Injection&#xff08;sql注入&#xff09; low 我们输入 1,出现报错信息&#xff0c;根据报错信息可知&#xff0c;查询语句是单引号闭合的字符型 接着判断字段数 1 order by 3# 报错 1 order by 2# 正常 所以字段数就是2 利用联合查询爆出数据库名…

农村小子背井离乡北漂的这些年

人生虽不尽人意、生活也并不完美、可生活依旧很美 1. 写在前面 由于工作变动及其他种种原因吧&#xff0c;很长的一段时间内没有再去写文章。始于2019年初夏&#xff0c;止于2020年初冬&#xff0c;再次落笔于2023年的夏季。恰好今天是端午节&#xff0c;祝大家端午安康 白驹过…

springboot第28集:springboot一些概念

DataScopeAspect 数据过滤处理 此切面在执行带有ControllerDataScope注解的方法之前进行数据权限过滤。首先获取当前登录用户&#xff0c;然后判断当前用户是否为超级管理员。如果不是超级管理员&#xff0c;则获取权限字符&#xff0c;默认使用上下文中的权限字符。接下来&am…

【计算机组成原理】2、二进制和十六进制转换,进制相减、内存地址偏移计算与容量计算

文章目录 一、进制转换1.1 二进制转十六进制1.2 十六进制转二进制 二、进制相减2.1 十六进制 三、内存地址偏移计算3.1 根据首末地址&#xff0c;求存储容量3.2 根据末地址 和 存储容量&#xff0c;求首地址 一、进制转换 1.1 二进制转十六进制 因 2 4 16 2^416 2416&#…

leetcode300. 最长递增子序列(动态规划-java)

最长递增子序列 leetcode300. 最长递增子序列题目描述解题思路代码演示: 二分法改进(N * logN)动态规划专题 leetcode300. 最长递增子序列 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/longest-increasing-subsequenc…

C++标准输出

C将输入和输出看作字节流&#xff0c;输入时&#xff0c;程序从输入流中抽取字节&#xff0c;输出时&#xff0c;程序将自己插入到输出流中&#xff0c;流充当了程序与流源或流目标之间的桥梁&#xff0c;也就是说C通过流与硬件&#xff0c;文件相关联&#xff0c;流赋予了C程序…

[数字图像处理]第六章 彩色图像处理

第六章 彩色图像处理 引言 ​ 彩色图像处理可分为两个主要领域&#xff1a;全彩色处理和伪彩色处理。在第一类中&#xff0c; 通常要求图像用全彩色传感器获取&#xff0c;如彩色电视摄像机或彩色扫描仪。在第二类中&#xff0c;问题是对一种特定的单色灰度或灰度范围赋予一种…

设计模式之装饰者模式笔记

设计模式之装饰者模式笔记 说明Decorator(装饰)目录装饰者模式示例类图快餐类炒饭类炒面类装饰者类鸡蛋类培根类测试类 说明 记录下学习设计模式-装饰者模式的写法。JDK使用版本为1.8版本。 Decorator(装饰) 意图:动态地给一个对象添加一些额外的职责。 结构: 其中&#x…

【Neo4j教程之CQL命令基本使用】

&#x1f680; Neo4j &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;C…

Python基础篇(二):入门基础必备知识

Python基础篇(一)&#xff1a;如何使用PyCharm创建第一个Python项目(包含tools) 入门基础必备知识 1. 标识符2. 关键字2.1 关键字字典 3. 引号3.1 表示字符串3.2 在字符串中使用引号3.3 创建多行字符串3.4 在注释中使用引号 4. 编码5. 输入输出5.1 输入示例5.2 输出示例5.3 格…

王道计算机网络学习笔记(3)——数据链路层

前言 文章中的内容来自B站王道考研计算机网络课程&#xff0c;想要完整学习的可以到B站官方看完整版。 三&#xff1a;数据链路层 3.1&#xff1a;数据链路层功能概述 结点&#xff1a;主机、路由器 链路&#xff1a;网络中两个结点之间的物理通道&#xff0c;链路的传输介…

PolarFormer:Multi-camera 3D Object Detection with Polar Transformer——论文笔记

参考代码&#xff1a;PolarFormer 1. 概述 介绍&#xff1a;在仓库RoboBEV中总结了现有的一些bev感知算法在不同输入情况下的鲁棒性&#xff0c;在这些感知算法中PolarFormer拥有较为不错的泛化性能。这个算法的思想是将之前由直角坐标系栅格化构建bev网格&#xff0c;转换到由…

Unity之透明度混合与ps的透明度混合计算结果不一致

一、问题 前段时间学习shader时发现了一个问题&#xff0c;一张纯红色透明度为128的图片叠加在一张纯绿色的图片上得出的结果与ps中的结果不一致。网上查找了ps中的透明混合的公式为 color A.rgb*A.alpha B.rgb*(1-A.alpha)。自己使用代码在unity中计算了一下结果总是不对。…

Python--异常处理

Python--异常处理 <font colorblue>一、异常<font colorblue>二、异常处理语句<font colorblue>1、try...except语句<font colorblue>2、try...except...else语句<font colorblue>3、try...except...finally语句<font colorblue>4、raise语…

leetcode354. 俄罗斯套娃信封问题(动态规划-java)

俄罗斯套娃信封问题 leetcode354. 俄罗斯套娃信封问题题目描述:解题思路代码演示 动态规划专题 leetcode354. 俄罗斯套娃信封问题 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/russian-doll-envelopes 题目描述: 给你…

c++学习之模板

目录 一&#xff0c;模板的概述 二&#xff0c;函数模板 1.函数模板的定义 2.函数模板的注意事项 3.函数模板的重载 4.函数模板的局限性 三&#xff0c;类模板 1.类模板的概念 2.类模板定义方式 3.类模板的成员函数在类外实现 4.函数模板作为类模板的友元 5.在写程…