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

news2024/11/24 20:29:55

目录

  • 题型一:反转单链表
    • 思路解析
    • 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;
	}
};

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

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

相关文章

键盘win键无法使用,win+r不生效、win键没反应、Windows键失灵解决方案(亲测可以解决)

最近几天发现自己笔记本的win键无法使用,win失灵了,但是外接键盘后则正常:。 这个问题困扰了我一周,我都以为自己的枪神坏了。 寻找了几个解决方法,网上看了好多好多稀里糊涂的办法,都是不管用的,这里给大…

onvif backchannel

Back Channel笔记_onvif backchannel-CSDN博客 backchannel 由客户端触发:

007 Linux fork()函数

前言 本文将会以提问的形式展开向你介绍fork函数 文章重点 关于fork函数,本文重点在于解决以下疑问 疑问一: 为什么fork之前的代码只有父进程执行,然而fork之后的代码父子进程都要执行 疑问二: 1、既然fork之后父子进程会执行一…

【微服务】API治理发展历史与未来趋势

目录 一、前言 二、API治理的价值和意义 2.1 API治理概念 2.2 API治理价值和意义 2.2.1 提升团队协同效率 2.2.2 降低产品运维成本 2.2.3 识别和降低系统的外部风险 2.2.4 提供更多的拓展性 三、API生命周期管理 ​编辑 3.1 规划阶段 3.2 开发阶段 3.3 测试阶段 3…

【Linux网络】网卡配置与修改主机名,做好基础系统配置

目录 一、网络配置命令 1、查看网卡信息ifconfig Linux永久修改ip地址 2、主机名修改 ①hostname 临时修改主机名 ②永久修改主机名 第一种,使用命令修改 第二种:修改配置文件 3、路由信息 再来拓展一下,永久修改路由表信息 4、检查…

如何在双11入手经济实惠的家用监控摄像头?把这篇文章看完再决定!

随着双十一大促的临近,后台收到了许多想要入手家用监控但不知道如何选择的用户私信。关于家用监控我们之前也和大家探讨过,感兴趣的可以查看《家用智能安防系统包括哪几个部分?如何应用?》,那么今天小编就和大家聊聊如…

TikTok shop美国小店适合哪些卖家做?附常见运营问题解答

一、Tiktok shop小店分类 大家都知道,美国小店可以分为5 种: 美国本土个人店: 最灵活,有扶持政策;美国法人企业店:要求高,有扶持政策;美国公司中国人占股店 (ACCU店) : 权重相对低&#xff0c…

C语言数据结构-----单链表(无头单向不循环)

前言 本篇讲述了单链表的相关知识,以及单链表增删查改的代码实现。 文章目录 前言1.链表1.1 链表的结构和概念 2.(增删查改)单链表的实现2.1 打印链表2.2 尾插2.3 尾删2.4 头插2.5 头删2.6 查找2.7 在指定位置(pos)前插入2.8 在指定位置(pos)删除2.9 在指定位置(p…

骨传导蓝牙耳机推荐,2023骨传导耳机选购攻略

相信大家佩戴入耳式耳机时间长后,都会出现耳朵痛的情况,这也是这类耳机的一个通病了,为了缓解这一问题,骨传导耳机出现了,并且凭借佩戴舒适,并且不会耳痛等优点迅速成为当下最受欢迎的耳机款式,…

第14章,lambda表达式与流处理例题

package 例题;import java.util.List; import java.util.stream.Collectors; import java.util. stream.Stream;public class 例题19 { public static void main(String[] args){List<例题14> list 例题14.get例题14List();//获取公共类的测试数据Stream<例题14>…

leetCode 206.反转链表 图解

206. 反转链表 - 力扣&#xff08;LeetCode&#xff09; 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表 class Solution { public:ListNode* reverseList(ListNode* head) {ListNode* s NULL;ListNode* phead;while(p) {headhead->nex…

分享4个MSVCP100.dll丢失的解决方法

msvcp100.dll是一个重要的动态链接库文件&#xff0c;它是Microsoft Visual C 2010 Redistributable Package的一部分。这个文件的作用是提供在运行C程序时所需的函数和功能。如果计算机系统中msvcp100.dll丢失或者损坏&#xff0c;就会导致软件程序无法启动运行&#xff0c;会…

python-jupyter实现OpenAi语音对话聊天

1.安装jupyter 这里使用的是jupyter工具&#xff0c;安装时需要再cmd执行如下命令&#xff0c;由于直接执行pip install jupyter会很慢&#xff0c;咱们直接使用国内源 pip install --user jupyter -i http://pypi.tuna.tsinghua.edu.cn/simple/ --trusted-host pypi.tuna.t…

leetcode一道比较难的链表题

今天还是继续来分享我们的链表题&#xff0c;这个题目有点难&#xff0c;主要是思路比较难想&#xff0c;但是如果沥青思路写起来就比较简单了&#xff08;我乱讲的&#xff09; 随机链表的复制 这个是题目的描述&#xff0c;大家也可以在链接里看&#xff0c;那我把这道题目…

React中组件之间如何通信?

一、是什么 我们将组件间通信可以拆分为两个词&#xff1a; 组件通信 回顾Vue系列的文章&#xff0c;组件是vue中最强大的功能之一&#xff0c;同样组件化是React的核心思想 相比vue&#xff0c;React的组件更加灵活和多样&#xff0c;按照不同的方式可以分成很多类型的组件…

Unity游戏开发基础之数据结构部分

设计模式 含义&#xff1a;帮助我们降低对象之间的耦合度常用的方法称为设计模式。使用设计模式是为了可重用代码&#xff0c;让代码更容易被其他人所理解&#xff0c;保证代码可靠性&#xff0c;使代码编制真正工程化&#xff0c;这是软件工程的基石。 分类&#xff1a; 创建…

Figma转Sketch文件教程,超简单!

相信大家做设计的都多多少少听过一点Figma和Sktech&#xff0c;这2个设计软件是目前市场上很受欢迎的专业UI设计软件&#xff0c;在全球各地都有很多粉丝用户。但是相对来说&#xff0c;Figma与Sketch只支持iOS系统有所不同&#xff0c;Figma是一个在线设计软件&#xff0c;不限…

Flink(二)【Flink 部署模式】

前言 今天是Flink学习的第二天&#xff0c;我的心情异常的复杂哈哈哈&#xff08;苦笑&#xff09;&#xff0c;学习上还是比较顺利的&#xff0c;感情上我并不擅长&#xff0c;所以心情波动大在所难免。害&#xff0c;至少还有学习让我不被各种糟糕琐碎的日常生活里的人和事所…

【2023方案开发】无刷电机自动打气泵方案

如今新能源车大行其道&#xff0c;而车厂在考虑成本和设计的情况下&#xff0c;将备胎给取消了&#xff0c;那假如在车胎气压不足的状态下&#xff0c;没有备胎更换&#xff0c;那将如何解决困境。气压不住需要打气&#xff0c;那配备一台打气泵尤为重要&#xff0c;即使常年可…

Git系列之Git入门级(带你走进Git的世界)

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是君易--鑨&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《Git实战开发》。&#x1f3af;&#x1f3af; &a…