当前位置: 首页 > news >正文

【数据结构】链表经典OJ题,常见几类题型(一)

目录

  • 题型一:反转单链表
    • 思路解析
    • OJ题实例
    • 解题代码
  • 题型二:快慢指针
    • 思路解析
    • OJ题实例
    • 解题代码
  • 两类题型的结合

题型一:反转单链表

思路解析

反转一个链表主要是想让第一个节点指向NULL,第二个节点指向第一个,以此类推。那么我们不难想到,想要反转其中一个节点,两个指针肯定是不够的,所以这就要求我们定义三个指针:分别指向当前节点n2,前一个节点n1,后一个节点n3
这里定义的三个指针主要作用:n1是为了能让当前节点能指向前一个节点地址,而n1就是记录前一个节点的地址,n3是为了在反转当前节点后,能找到后一个节点的地址
那么定义一个循环后依此思路便可反转链表了。当然循环结束的条件为n3 == NULL,那么再仔细想一下,其实还有最后一个节点没有反转,此节点只需要最后单独反转便可。那么为什么不让循环结束条件为n2 == NULL呢?是因为此时n3 == n2->nextn2又等于NULL,这就导致了错误。
还要一点需要注意的是:在解题前我们还要单独判断一下此链表是否为空。

图解如下:
在这里插入图片描述

OJ题实例

LeetCode链接:206. 反转链表

解题代码

struct ListNode* reverseList(struct ListNode* head)
{//判断链表为空的情况if(head==NULL){return NULL;}else{//反转链表struct ListNode* n1=NULL;struct ListNode* n2=head;struct ListNode* n3=head->next;while(n3){n2->next=n1;n1=n2;n2=n3;n3=n3->next;}//最后一个节点的判断n2->next=n1;return n2;}
}

题型二:快慢指针

思路解析

通常快慢指针方法出现在需要找链表中间节点,链表带环等题型中。快慢指针的逻辑思路如下:
先定义两个结构体指针struct ListNode* slow = head, *fast = head;,先将他们指向头节点,在写一个循环,每次循环慢指针向后走一个节点,即slow = slow->next;快指针向后走两个节点,即fast = fast->next->next;,循环的判断条件为fast != NULL && fast->next != NULL,这样便很好解决了链表为空和只有一个节点的情况。需要注意的是如果节点数为奇slow刚好在中间节点,节点数为偶slow在中间两个节点的后一个

OJ题实例

LeetCode链接: 876. 链表的中间结点

解题代码

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

两类题型的结合

牛客链接: OR36 链表的回文结构

解题思路:
此题可以先找到中间节点,然后把后半部分逆置,然后进行前后两部分一一比对,如果节点的值全部相同,则即为回文。

class PalindromeList {
public:bool chkPalindrome(ListNode* A) {if (A == NULL || A->next == NULL)return true;ListNode* slow, *fast, *prev, *cur, *nxt;slow = fast = A;//找到中间节点,即题型二快慢指针while (fast && fast->next){slow = slow->next;fast = fast->next->next;}prev = NULL;//后半部分逆置,即题型一链反转cur = slow;while (cur){nxt = cur->next;cur->next = prev;prev = cur;cur = nxt;}//逐点比对while (A && prev){if (A->val != prev->val)return false;A = A->next;prev = prev->next;}return true;}
};

相关文章:

  • django+drf+vue 简单系统搭建 (2) - drf 应用
  • 3D全景技术,为我们打开全新宣传领域
  • HBase导出建表语句
  • 怎样使用ovsyunlive在web网页上直接播放rtsp/rtmp视频
  • GZ038 物联网应用开发赛题第2套
  • 麒麟KYLINIOS软件仓库搭建03-软件仓库添加新版本的软件包
  • 客户服务质量提升的三种思路
  • C# WebSocket 服务器
  • zookeeper:服务器有几种状态?
  • 顶板事故防治vr实景交互体验提高操作人员安全防护技能水平
  • AI:73-结合语法知识的神经机器翻译研究
  • ChatGPT是什么?黑客试图淹没其服务
  • sqlplus set参数大区
  • Flutter开发实战之上传身份照片并认证
  • 打开知识大门,电大搜题助您迈向成功
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • 4. 路由到控制器 - Laravel从零开始教程
  • canvas 绘制双线技巧
  • happypack两次报错的问题
  • JAVA_NIO系列——Channel和Buffer详解
  • orm2 中文文档 3.1 模型属性
  • Redux系列x:源码分析
  • spark本地环境的搭建到运行第一个spark程序
  • SpringCloud集成分布式事务LCN (一)
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • ubuntu 下nginx安装 并支持https协议
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 浮现式设计
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 前端攻城师
  • 让你的分享飞起来——极光推出社会化分享组件
  • 回归生活:清理微信公众号
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (多级缓存)多级缓存
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (五)IO流之ByteArrayInput/OutputStream
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • (转) ns2/nam与nam实现相关的文件
  • .Net MVC4 上传大文件,并保存表单
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • .pop ----remove 删除
  • @font-face 用字体画图标
  • [51nod1610]路径计数
  • [ACTF2020 新生赛]Upload 1
  • [BZOJ]4817: [Sdoi2017]树点涂色
  • [echarts] y轴不显示0
  • [javascript]Tab menu实现
  • [lintcode easy]Maximum Subarray