算法练习-反转一个单链表(思路+流程图+代码)

news2024/10/2 9:20:46

难度参考

        难度:简单

        分类:链表

        难度与分类由我所参与的培训课程提供,但需要注意的是,难度与分类仅供参考。以下内容均为个人笔记,旨在督促自己认真学习。

题目

        反转一个单链表(不带头节点)
        示例1:
        输入:1->2->3->4->5->null
        输出:5->4->3->2->1->null
        解释:链表反转后顺序逆序,由1->2->3->4->5->null,变成了5->4->3->2->1->null

思路

        初始化两个指针:prevcurrent,分别指向当前节点的前一个节点和当前节点。

  1. 使用一个临时指针 nextNode 保存当前节点的下一个节点,以备后续使用。
  2. 在循环中,将当前节点的 next 指针指向 prev,实现反转操作。
  3. 移动 prevcurrent 指针,继续向后遍历链表。
  4. 重复步骤 3 和 4,直到 current 指针指向链表末尾,即 currentNULL
  5. 返回反转后的链表的头节点,即原链表的末尾节点

示例

        理解链表反转可能有些抽象,但可以通过将其拆分成简单的步骤来理解。以下是更具体的步骤和示例,帮助你更好地理解链表反转:

        假设我们有一个链表:1 -> 2 -> 3 -> 4 -> 5 -> null

  1. 初始化两个指针,prevcurrent,初始时都指向 null
  2. 从链表的头部开始遍历,首先处理节点 1
    • prev 指向 null
    • current 指向 1
  3. 在每一步中,我们将 currentnext 指向 prev,即将 1 -> null 变成 1 <- null,然后移动指针:
    • prev 指向 1
    • current 指向 2
  4. 重复上述步骤,将每个节点的 next 指向前一个节点,直到到达链表末尾:
    • prev 指向 4
    • current 指向 5
  5. 最终,链表变成:5 -> 4 -> 3 -> 2 -> 1 -> null

        通过不断将当前节点的 next 指向前一个节点,我们逐步完成了链表的反转。这是链表反转的基本思路。希望这个示例有助于你更好地理解这个过程。

梳理

  1. 首先,我们定义了一个单链表节点结构 ListNode,其中包括一个整数值 val 用于存储节点的值,以及一个指向下一个节点的指针 next

  2. 然后,定义了一个 reverseList 函数,它接受一个头节点 head 作为参数,用于反转单链表。

  3. reverseList 函数中,我们初始化了两个指针 prevcurrent,开始时都指向 NULLprev 用于存储当前节点的前一个节点,而 current 用于表示当前节点。

  4. 使用 while 循环遍历链表,循环条件是 current != NULL,即遍历链表直到当前节点为空(链表末尾)。

  5. 在每次循环中,我们首先保存下一个节点的指针为 nextNode,以备后续使用。

  6. 然后,将当前节点的 next 指针指向前一个节点 prev,这样就完成了当前节点指向前一个节点的反转操作。

  7. 接着,将 prev 指针移动到当前节点,为下一轮循环做准备。

  8. 最后,将 current 指针移动到下一个节点 nextNode,继续下一轮循环。

  9. 当循环结束时,prev 指针指向原链表的末尾节点,即反转后的链表的头节点,因此我们返回 prev 作为反转后链表的新头节点。

  10. main 函数中,我们创建了一个示例链表,然后调用 printList 函数打印原始链表,再调用 reverseList 函数进行链表反转,最后再次调用 printList 函数打印反转后的链表。

代码

#include <iostream>

using namespace std;

// 定义单链表节点结构
struct ListNode {
    int val;           // 存储节点的值
    ListNode* next;    // 指向下一个节点的指针
    ListNode(int x) : val(x), next(NULL) {}  // 构造函数,初始化节点的值和指针
};

// 反转单链表的函数
ListNode* reverseList(ListNode* head) {
    ListNode* prev = NULL;      // 初始化前一个节点为NULL,用于存储当前节点的前一个节点
    ListNode* current = head;   // 初始化当前节点为头节点,从头节点开始反转

    while (current != NULL) {   // 循环遍历链表,直到当前节点为NULL(即链表末尾)
        ListNode* nextNode = current->next;  // 保存下一个节点的指针,以备后续使用
        current->next = prev;                // 反转当前节点的指针方向,使其指向前一个节点
        prev = current;                     // 移动prev指针,指向当前节点,为下一轮循环做准备
        current = nextNode;                 // 移动current指针,指向下一个节点,继续反转操作
    }

    return prev;  // 返回新的头节点,即原链表的末尾节点
}

// 打印链表的函数
void printList(ListNode* head) {
    ListNode* current = head;  // 从头节点开始遍历链表
    while (current != NULL) {  // 循环遍历链表,直到当前节点为NULL
        cout << current->val << " ";  // 打印当前节点的值
        current = current->next;      // 移动到下一个节点
    }
    cout << "null" << endl;  // 打印链表末尾的null表示链表结束
}

int main() {
    // 创建示例链表:1->2->3->4->5->null
    ListNode* head = new ListNode(1);  // 创建头节点并初始化值为1
    head->next = new ListNode(2);      // 创建下一个节点并初始化值为2
    head->next->next = new ListNode(3); // 创建下一个节点并初始化值为3
    head->next->next->next = new ListNode(4);  // 创建下一个节点并初始化值为4
    head->next->next->next->next = new ListNode(5);  // 创建下一个节点并初始化值为5

    cout << "原始链表:" << endl;
    printList(head);  // 打印原始链表

    // 反转链表
    ListNode* reversedHead = reverseList(head);  // 调用反转函数

    cout << "反转后的链表:" << endl;
    printList(reversedHead);  // 打印反转后的链表

    return 0;
}

        时间复杂度:O(n)
        空间复杂度:O(1)

打卡

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

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

相关文章

hub汉语有轮毂的意思吗?

问题描述&#xff1a;hub汉语有轮毂的意思吗&#xff1f; 问题解答&#xff1a; 是的&#xff0c;"hub"&#xff08;中文翻译为"轮毂"&#xff09;是指机械装置中的一个中心部分&#xff0c;通常用于连接或支持其他部分。在车辆的轮胎系统中&#xff0c;…

STC8H8K蓝牙智能巡线小车——1. 环境搭建(基于RTX51操作系统)

1. 基本介绍 开发环境准备&#xff1a;Keil uVision5 烧录软件&#xff1a;STC-ISP&#xff08;V6.92A&#xff09; 芯片&#xff1a; STC8H8K64U-45I-LQFP64 芯片引脚&#xff1a; 2.创建项目 打开Keil&#xff0c;点击【Project】&#xff0c;选择【new uVersion proje…

C语言——大头记单词

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 每一发奋努力的背后&#xff0c;必有加…

【​电力电子在电力系统中的应用​】6 滞环电流控制的PWM整流器 + STATCOM整流器 + APF仿真

【仅供参考】 【2023.06西南交大电力电子在电力系统中的应用】 目录 步骤一&#xff1a;基于滞环电流控制的PWM整流器仿真 1.1 仿真要求 1.2 仿真电路原理及设计 1.2.1 主电路的搭建 1.2.2 控制电路的搭建 1.3 波形分析 步骤二&#xff1a;从PWM整流器到STATCOM仿真 2…

ARM day5、day6 硬件编程

一、硬件 fs4412 sd卡 串口线 电源 二、根据原理图点灯 1、确定需求&#xff1a; 点灯&#xff08;亮 or 灭&#xff09; 2、查看原理图 2.1 外设原理图 devboard 查找LED2->CHG_COK(核心板) 2.2 核心板原理图 coreboard 查找CHG_COK->XEINT23/KP_ROW7/ALV_DBG…

Redis分布式锁存在的问题以及解决方式

☆* o(≧▽≦)o *☆嗨~我是小奥&#x1f379; &#x1f4c4;&#x1f4c4;&#x1f4c4;个人博客&#xff1a;小奥的博客 &#x1f4c4;&#x1f4c4;&#x1f4c4;CSDN&#xff1a;个人CSDN &#x1f4d9;&#x1f4d9;&#x1f4d9;Github&#xff1a;传送门 &#x1f4c5;&a…

ROS---传感器集成

ROS—传感器集成 对于ROS机器人&#xff0c;如果想让其启动&#xff0c;我们需要逐一启动底盘控制与激光雷达&#xff0c;操作有点冗余。并且如果只是简单启动这些节点&#xff0c;那么在在 rviz 中显示时&#xff0c;会发现出现了TF转换异常&#xff0c;比如参考坐标系设置为o…

如何设置Windows 11的WSL系统用作备用桌面环境

如何设置Windows 11的WSL系统用作开发环境&#xff08;含Astrill设置&#xff09; 如何设置Windows 11的WSL系统用作备用桌面环境 引子&#xff1a; 2023年末&#xff0c;公司突然遭遇网络攻击&#xff0c;调整了防火墙设置&#xff0c;连接VPN用来飞X软件&#xff0c;与原来…

JAVA基础----String类型的简单介绍

文章目录 1. String类的重要性2. 常用方法2.1 字符串构造2.2 String对象的比较2.3 字符串查找2.4 转化2.5 字符串替换2.6 字符串拆分2.7 字符串截取2.8 其他操作方法2.9 字符串的不可变性2.10 字符串修改2.11 借助StringBuffer 和 StringBuilder 观察String进行修改的效率 3. S…

实时语音多实例实现设计方案(服务端)

1.端上接入协议 如何自行开发代码访问阿里语音服务_智能语音交互(ISI)-阿里云帮助中心 2.接口修改结果逻辑及端上调用步骤 阿里client server交互流程图&#xff1a; 阿里语音接收识别结果&#xff1a; begin_time time 含义 客户端循环发送语音数据&#xff0c;持续接收…

vue学习,使用provide/inject通信

提示&#xff1a;组件的provide&#xff0c;可以被其内所有层级的组件&#xff0c;通过inject引用 文章目录 前言一、通信组件二、效果三、参考文档总结 前言 需求&#xff1a;使用provide/inject通信 一、通信组件 1、AA.vue <template><div class"test"…

【开发实践】前端jQuery+gif图片实现载入界面

一、需求分析 载入界面&#xff08;Loading screen&#xff09;是指在计算机程序或电子游戏中&#xff0c;当用户启动应用程序或切换到新的场景时&#xff0c;显示在屏幕上的过渡界面。它的主要作用是向用户传达程序正在加载或准备就绪的信息&#xff0c;以及提供一种视觉上的反…

腾讯云2核2G4M云服务器值得买吗?

随着云计算技术的不断发展和普及&#xff0c;越来越多的企业和个人开始意识到云服务器的优势&#xff0c;并选择将其业务迁移至云端。作为国内领先的云计算服务提供商&#xff0c;腾讯云一直致力于为用户提供高品质的云服务器服务。其中&#xff0c;腾讯云2核2G4M云服务器备受关…

Docker 安装 MySQ

Docker 安装 MySQL MySQL 是世界上最受欢迎的开源数据库。凭借其可靠性、易用性和性能&#xff0c;MySQL 已成为 Web 应用程序的数据库优先选择。 1、查看可用的 MySQL 版本 访问 MySQL 镜像库地址&#xff1a;https://hub.docker.com/_/mysql?tabtags 。 可以通过 Sort b…

SpringBoot教程(十二) | SpringBoot集成JPA

SpringBoot教程(十二) | SpringBoot集成JPA 1. JPA简介 概念&#xff1a; JPA顾名思义就是Java Persistence API的意思&#xff0c;是JDK 5.0注解或XML描述对象&#xff0d;关系表的映射关系&#xff0c;并将运行期的实体对象持久化到数据库中。 优势&#xff1a; 标准化 …

Postman使用方法指南,最全面的教程

Postman使用教程 一、Postman介绍 ​ Postman是一个英语单词&#xff0c;名词&#xff0c;作名词时意为“邮递员&#xff1b;邮差”。 ​ Postman是一个接口测试工具,在做接口测试的时候,Postman相当于一个客户端,它可以模拟用户发起的各类HTTP请求,将请求数据发送至服务端,获…

【PS】PS设计图欣赏、学习、借鉴

【PS】PS设计图欣赏、学习、借鉴 bilibili萌新PS学习计划&#xff1a;PS教程全套零基础教学视频&#xff08;全套81节全新版本&#xff09;

Flink1.17 基础知识

Flink1.17 基础知识 来源&#xff1a;B站尚硅谷 目录 Flink1.17 基础知识Flink 概述Flink 是什么Flink特点Flink vs SparkStreamingFlink的应用场景Flink分层API Flink快速上手创建项目WordCount代码编写批处理流处理 Flink部署集群角色部署模式会话模式&#xff08;Session …

conda install命令无法安装pytorch

由于网络问题&#xff0c;直接采用conda install命令可能无法直接下载对应的cuda包。 方法一&#xff1a;采用pip命令替代 步骤1&#xff1a;切换pip的源为国内源&#xff1a; 若只是临时切换&#xff1a; pip install -i https://pypi.tuna.tsinghua.edu.cn/simple some-p…

分子动力学模拟—LAMMPS 模拟(固体和液体)数据后处理软件(六)

记录一下检索到一篇分子动力学模拟数据后处理的软件。 感谢论文的原作者&#xff01; 主要功能&#xff1a; Structure Analysis Ackland Jones Analysis CentroSymmetry Parameter Common Neighbor Analysis Common Neighbor Parameter Atomic Structure Entropy Stein…