单链表OJ题(2):反转链表、找中间节点

目录

1.反转链表

反转链表总结:

2.链表的中间节点(快慢指针法)

快慢指针法总结


1.反转链表

在这道题中,我们需要把一个单链表反转它们的指向,这里,我们给出了一个好理解的简单解法,就是用三个指针去解决这道题。 先给出完整的代码。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
 typedef struct ListNode ListNode;
struct ListNode* reverseList(struct ListNode* head) {
    //创建头指针
    ListNode* n1 = NULL;
    ListNode* n2 = head;
    if(n2==NULL){
        return NULL;
    }
    ListNode* n3 = n2->next;
    while(n2){
        n2->next=n1;
        n1 = n2;
        n2 = n3;
        if(n3)
            n3=n3->next;
    }
    return n1;
}

假设,我们的原链表为head,我们申请了n1,n2,n3三个指针,其中,n1初始化为NULLn2初始化为head(图中的第一个节点)n3初始化为head->next(也就是图中的第二个节点) 

 

第一次操作:

第二次操作:

 

第三次操作:

第四次操作:(注意:最后一次操作,n3的指针指向,不能让n3出现NULL->NULL的情况

然后,我们的步骤如下:

1、遍历原链表中的每个节点,每次遍历,先使n1的指针指向n2的节点(n1=n2)然后让n2的节点指向n3(n2=n3)最后让n3的节点指向n3的下一个节点(n3=n3->next) 

2、注意,要在循环中判断以下n3的指针指向,防止出现NULL->NULL的情况。

反转链表总结:

这里面最重要的是我们要改变当前的节点的指向关系的时候,注意要先把当前节点指向的下一个节点的指针保存下来。如果我们不保存就改变指向关系的化,就会导致一个严重的错误,我们原链表中当前节点的下一个节点就找不到了。如下图,当我们遍历原链表的时候,我们需要让第一个链表的节点指向NULL但是我们没有存储第二个节点的地址当我们改变了指向让第一个节点的地址为NULL的时候原链表后面的节点就没办法找到

 

这个时候,我们就需要在改变当前节点指向关系前将这个节点的next域存储起来,这样我们就可以实现通过n3找到原链表节点通过n2就可以改变当前链表的指向关系。 

2.链表的中间节点(快慢指针法)

 

(1)在看到这个题的时候,我们能够都想到的同用解法是用计数器来做 ,下面是具体步骤:

1、首先我们遍历原链表,定义一个变量count存储节点的个数然后将每个节点都做+1的操作,这样我们就得到了链表的节点总个数count

2、然后,我们对count/2得到中间节点的位置然后再次遍历原链表找到下标为:count/2的位置上的节点,并返回

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
 typedef struct ListNode ListNode;
struct ListNode* middleNode(struct ListNode* head) {
    ListNode* pcur = head;
    int count = 0;
    while(pcur){
        count++;
        pcur = pcur->next;
    }
    pcur = head;
    count /= 2;
    while(count--){
        pcur = pcur->next;
    }
    return pcur;
}

 (2)这里提供一种很巧妙的解题方法,我们只需要遍历一遍链表就能够得到链表中间的位置,这个就是我们接下来介绍的快慢指针法了。

先给出代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
 typedef struct ListNode ListNode;
struct ListNode* middleNode(struct ListNode* head) {
    if(head==NULL){
        return NULL;
    }
    //定义快慢指针
    ListNode* slow ,*fast;    
    slow = fast = head;
    while(fast && fast->next){
        slow = slow->next;
        fast = fast->next->next;
    }
    return slow;
}

1、刚开始,我们创建两个指针slow和fast都指向头节点.

2、接下来,我们规定,slow每次走一个节点fast每次走两个节点,当遍历结束时,slow指针指向的节点就是我们需要的中间节点

3、循环结束的条件fast!==NULL && fast->next!=NULL

我们继续深入解析以下结束的循环条件是如何得到的,这就得要根据节点个数是否为奇数和偶数来确定。 

1)当讨论的节点个数为偶数的时候: 

阶段1:

阶段2: 

阶段3:

 从这里可以得到,当我们得fast指针指向NULL时循环结束,此时,slow指向得节点正好是我们需要得中间节点。

2)当讨论的节点个数为奇数的时候: 

阶段1:

阶段2:

阶段3:

从这里,我们可以看出来,当fast的next指向为NULL时我们的循环结束,此时,slow指针指向的节点就是我们的中间节点。

然后,我们得出结论,当fast和fast->next有一个为NULL时我们的循环条件就结束,此时我们的slow指针指向的节点就是中间节点。 (这里的)

快慢指针法总结:

这里的快慢指针法可以很快的找到我们所需要的单链表中的中间节点,代码量也很少,是一个很不错的解题思路,在涉及到用中间节点解题的时候,可以参考以下这个方法。 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++ 日志管理 spdlog 使用笔记

文章目录 Part.I IntroductionChap.I 预备知识Chap.II 常用语句 Part.II 使用Chap.I 简单使用Chap.II 自定义日志格式 Part.III 问题&解决方案Chap.I 如果文件存在则删除 Reference Part.I Introduction spdlog 是一个开源的 C 日志管理工具,Git 上面的地址为 …

在html中引用unpkg的vue3,v-model无法绑定方法

如果用下面代码引用vue使用&#xff0c;则注意v-model无法绑定方法。 <script src"https://unpkg.com/vue3/dist/vue.global.js"></script> 例如&#xff1a; <span>方法-全名&#xff1a;</span><input type"text" v-model&…

如何将原本打开Edge呈现出的360浏览器,更换成原本的Edge页面或者百度等其他页面

每次打开Edge浏览器&#xff0c;都会呈现出360浏览器的页面&#xff0c;很烦。以下将说明如果将呈现出的360浏览器&#xff0c;更换成原本的Edge页面或者百度等其他页面。 1.找到你的控制面板&#xff0c;点击卸载程序。 2. 找到360安全卫士&#xff0c;右键单击更改/卸载。 3…

【深度学习|地学应用】人工智能技术的发展历程与现状:探讨深度学习在遥感地学中的应用前景

【深度学习|地学应用】人工智能技术的发展历程与现状&#xff1a;探讨深度学习在遥感地学中的应用前景 【深度学习|地学应用】人工智能技术的发展历程与现状&#xff1a;探讨深度学习在遥感地学中的应用前景 文章目录 【深度学习|地学应用】人工智能技术的发展历程与现状&…

抖音评论采集 可采子评论

下载&#xff1a;【1】https://drive.uc.cn/s/5257861b109b4?public1 【2】https://pan.quark.cn/s/e54155575698

python pip更换(切换)国内镜像源

国内镜像源列表(个人推荐清华大学的源) ​ 清华大学&#xff1a; https://pypi.tuna.tsinghua.edu.cn/simple阿里云&#xff1a; http://mirrors.aliyun.com/pypi/simple豆瓣&#xff1a; http://pypi.douban.com/simple中国科技大学&#xff1a; https://pypi.mirrors.ustc.e…

Linux 重启命令全解析:深入理解与应用指南

Linux 重启命令全解析&#xff1a;深入理解与应用指南 在 Linux 系统中&#xff0c;掌握正确的重启命令是确保系统稳定运行和进行必要维护的关键技能。本文将深入解析 Linux 中常见的重启命令&#xff0c;包括功能、用法、适用场景及注意事项。 一、reboot 命令 功能简介 re…

福鼎自闭症全托干预:为福鼎地区自闭症患者提供个性化教育

在探讨自闭症儿童的教育与干预时&#xff0c;个性化与全面关怀成为了不可忽视的关键词。福鼎地区的自闭症全托干预项目&#xff0c;以其对患儿个体差异的深刻理解与尊重&#xff0c;为自闭症患者提供了量身定制的支持。而在遥远的广州&#xff0c;星贝育园自闭症儿童寄宿制学校…

js基础入门篇

1.输出语句&#xff0c;内部样式&#xff0c;外部样式&#xff0c;数组定义 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.…

Oracle OCP认证考试考点详解082系列01

题记&#xff1a; 本篇博文是Oracle OCP认证考试考点详解082系列的第一篇&#xff0c;本系列主要讲解Oracle OCP认证考试考点&#xff08;题目&#xff09;&#xff0c;适用于19C/21C,跟着学OCP考试必过。 1. 第一题&#xff1a; 1. 题目 2. 解析及答案 关于Oracle数据库中节…

numpy——索引切片

一、索引和切片 import numpy as npx np.arange(48).reshape(6, 8) print(x)# 选取第二行 print(x[1]) #从0开始&#xff0c;取得第2行# 选取第二行, 第二列 print(x[1][1])# 选取第三行到最后一行, 第一列到最后一列 print(x[2:,2:])# 花式索引 (1, 1) 和 (4, 4) print(&quo…

.NET 8 中的 Mini WebApi

介绍 .NET 8 中的极简 API 隆重登场&#xff0c;重新定义了我们构建 Web 服务的方式。如果您想知道极简 API 的工作原理以及它们如何简化您的开发流程&#xff0c;让我们通过一些引人入胜的示例来深入了解一下。 .NET 极简主义的诞生 想想我们曾经不得不为一个简单的 Web 服务…

【在Linux世界中追寻伟大的One Piece】Socket编程UDP(续)

目录 1 -> V3版本-实现简单聊天室 1 -> V3版本-实现简单聊天室 UdpServer.hpp #pragma once#include <iostream> #include <string> #include <cerrno> #include <cstring> #include <unistd.h> #include <strings.h> #include &…

XHCI 1.2b 规范摘要(六)

系列文章目录 XHCI 1.2b 规范摘要&#xff08;一&#xff09; XHCI 1.2b 规范摘要&#xff08;二&#xff09; XHCI 1.2b 规范摘要&#xff08;三&#xff09; XHCI 1.2b 规范摘要&#xff08;四&#xff09; XHCI 1.2b 规范摘要&#xff08;五&#xff09; XHCI 1.2b 规范摘要…

Anki插件Export deck to html的改造

在Anki中进行复习时&#xff0c;每次只能打开一条笔记。如果积累了很多笔记&#xff0c;有时候会有将它们集中输出成一个pdf进行阅读的想法。Anki插件Export deck to html&#xff08;安装ID&#xff1a;1897277426&#xff09;就有这个功能。但是&#xff0c;这个插件目前存在…

哈希表——unordered_set和unordered_map的封装

个人主页&#xff1a;敲上瘾-CSDN博客 个人专栏&#xff1a;游戏、数据结构、c语言基础、c学习、算法 在本章关于哈希表的设计在这里就随便提一点不再过多的讲解&#xff0c;而把重点放在封装部分。 目录 一、哈希表的设计 1.模板参数的设计 二、迭代器封装 1.迭代器简单…

理解计算机系统_异常控制流(一):异常

前言 以<深入理解计算机系统>(以下称“本书”)内容为基础&#xff0c;对程序的整个过程进行梳理。本书内容对整个计算机系统做了系统性导引,每部分内容都是单独的一门课.学习深度根据自己需要来定 引入 异常控制流这章实际上是操作系统的一部分.操作系统简单的…

驱动学习(三)符号导出

1.什么是符号&#xff1f; 主要是指全局变量和函数 2.为什么要导出符号&#xff1f; ​ linux内核采用的是模块化的形式管理内核代码。内核中每个模块之间是相互独立的&#xff0c;也就是说A模块的全局变量和函数&#xff0c;B模块是无法访问的。若B模块想要使用A模块中的已有…

python爬虫——Selenium的基本使用

目录 一、Selenium的介绍 二、环境准备 1.安装Selenium 2.安装WebDriver 三、元素定位 1.常用定位元素的方法 2. 通过指定方式定位元素 四、窗口操作 1.最大化浏览器窗口 2.设置浏览器窗口大小 3.切换窗口或标签页 切换回主窗口 4. 关闭窗口 关闭当前窗口 关闭所…

java_方法重载、可变参数、作用域

方法重载 基本介绍 java 中允许同一个类中&#xff0c;多个同名方法的存在&#xff0c;但要求 形参列表不一致&#xff01; 比如&#xff1a;System.out.println(); out 是 PrintStream 类型 重载的好处 减轻了起名的麻烦减轻了记名的麻烦 案例 public class OverLoad01 …