利用编程思维做题之反转链表

news2024/10/11 16:03:18

牛客网题目

1. 理解问题

        给到我们的是一个单链表的头节点 pHead,要求反转后,返回新链表的头节点。

         首先在心里设想能够快速理解的例子,如给你123序列,要你反转此序列如何回答?将最后一个数字3作为头,然后修改3后面跟着的数字为2,2后面的数字为1,这就是一个单链表的简单应用。需要提前考虑的问题:如何获取最后一个数字、遍历所有数值时需要区分前一个数值与后一个数值。

        单链表的特点是每个节点包含一个值和一个指向下一个节点的指针,因此反转链表的过程实际上是改变每个节点的指针方向。

2. 输入输出

  • 输入:单链表的头节点 pHead

  • 输出:反转后的链表的头节点。

3. 链表结构

        单链表的节点通常定义为:

struct ListNode {
    int val;               // 节点的值
    struct ListNode *next; // 指向下一个节点的指针
};

4. 制定策略

        我们可以使用迭代的方法反转链表,核心思想是通过遍历链表并逐个改变指针方向。以下是具体步骤:

  1. 初始化指针

    • prev指针: 表示前一个数值,可以用于追踪新链表的头节点,初始为 NULL

    • curr指针:表示当前数值,用于遍历链表,初始为 pHead

  2. 遍历链表

    • 在每次循环中,保存当前节点的下一个节点 nextTemp(按123的顺序遍历所有数值)

    • 将当前节点的 next 指针指向 prev(相当于反转操作,如1指向空、2指向1、3指向2)

    • 更新 prev 为当前节点 curr(将prev后移)

    • curr移动到下一个节点 nextTemp(curr后移)

  3. 返回新链表的头节点

    • curr 为空时,prev 就是新链表的头节点,即取到最后一个数值。

5. 实现代码

        以下是反转单链表的 C 语言关键函数实现:

struct ListNode {
    int val;
    struct ListNode *next;
};

struct ListNode* reverseList(struct ListNode* pHead) {
    struct ListNode* prev = NULL; // 上一个节点
    struct ListNode* curr = pHead; // 当前节点
    struct ListNode* nextTemp = NULL; // 下一个节点

    while (curr != NULL) {
        nextTemp = curr->next; // 保存下一个节点
        curr->next = prev;     // 反转当前节点的指针
        prev = curr;           // 移动 prev 到当前节点
        curr = nextTemp;       // 移动到下一个节点
    }

    return prev; // 返回新链表的头节点
}

5.1 完整c语言代码

#include <stdio.h>
#include <stdlib.h>

// 定义单链表节点结构
struct ListNode {
    int val;                // 节点的值
    struct ListNode *next;  // 指向下一个节点的指针
};

// 反转链表的函数
struct ListNode* reverseList(struct ListNode* pHead) {
    struct ListNode* prev = NULL; // 上一个节点
    struct ListNode* curr = pHead; // 当前节点
    struct ListNode* nextTemp = NULL; // 下一个节点

    // 遍历链表
    while (curr != NULL) {
        nextTemp = curr->next; // 保存下一个节点
        curr->next = prev;     // 反转当前节点的指针
        prev = curr;           // 更新 prev 为当前节点
        curr = nextTemp;       // 移动到下一个节点
    }

    return prev; // 返回新链表的头节点
}

// 创建新节点的辅助函数
struct ListNode* createNode(int value) {
    struct ListNode* newNode = (struct ListNode*)malloc(sizeof(struct ListNode));
    newNode->val = value;
    newNode->next = NULL;
    return newNode;
}

// 打印链表的辅助函数
void printList(struct ListNode* head) {
    struct ListNode* current = head;
    while (current != NULL) {
        printf("%d -> ", current->val);
        current = current->next;
    }
    printf("NULL\n");
}

// 测试代码
int main() {
    // 创建链表 {1 -> 2 -> 3}
    struct ListNode* head = createNode(1);
    head->next = createNode(2);
    head->next->next = createNode(3);

    printf("Original list:\n");
    printList(head); // 输出原链表

    // 反转链表
    struct ListNode* reversedHead = reverseList(head);

    printf("Reversed list:\n");
    printList(reversedHead); // 输出反转后的链表

    // 释放内存
    struct ListNode* temp;
    while (reversedHead != NULL) {
        temp = reversedHead;
        reversedHead = reversedHead->next;
        free(temp);
    }

    return 0;
}

5.2 代码说明
  1. 节点定义:定义了一个 ListNode 结构体,包含一个整型值和指向下一个节点的指针。

  2. 反转函数reverseList 函数通过迭代的方法反转链表,更新每个节点的指针。

  3. 辅助函数

    • createNode:用于创建新节点并返回节点指针。

    • printList:用于打印链表的内容,方便测试和调试。

  4. 主函数:在 main 函数中创建一个链表 {1 -> 2 -> 3},调用反转函数,并打印原链表和反转后的链表。

5.3 运行结果

        运行此代码时,您将看到原链表和反转后的链表的输出:

       Original list:
        1 -> 2 -> 3 -> NULL
        Reversed list:
        3 -> 2 -> 1 -> NULL

6. 时间和空间复杂度分析

  • 时间复杂度:O(n),因为我们遍历了链表一次。

  • 空间复杂度:O(1),只使用了常量级别的额外空间。

7. 总结

        通过上述步骤,培养我们理解题目、分析题目到解决题目的思维,确定解决方案且成功实现了代码。抽象出这种方法,它不仅适用于链表反转的问题,也可以推广到其他需要遍历和修改链表结构的情况。

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

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

相关文章

如何修复 Windows 10 /11上 CrowdStrike 导致的蓝屏死机问题

CrowdStrike 是一家领先的网络安全技术提供商&#xff0c;为终端、云工作负载、身份和数据提供安全服务。其 Falcon 平台是一种统一的、云交付的安全解决方案&#xff0c;旨在防止所有类型的攻击&#xff0c;包括恶意软件等。然而&#xff0c;Windows 上 Falcon Sensor 代理的最…

ENSP静态路由实验 10.11

0x01 拓扑图 0x02 配置各接口和PC1、2的IP地址 PC1&#xff1a; PC2&#xff1a; AR1&#xff1a; 配置AR1&#xff0c;改名为R1&#xff0c;并配置各接口IP&#xff0c;随后保存。 <R1>system-view [Huawei]sysname R1 [R1]int g0/0/2 [R1-GigabitEthernet0/0/2]ip ad…

R语言结构方程模型(SEM)在生态学领域中的应用

结构方程模型&#xff08;Sructural Equation Model&#xff09;是一种建立、估计和检验研究系统中多变量间因果关系的模型方法&#xff0c;它可以替代多元回归、因子分析、协方差分析等方法&#xff0c;利用图形化模型方式清晰展示研究系统中变量间的因果网络关系&#xff0c;…

【向上管理第一步】2小时速成专业级看板,让高效汇报触手可及!

面对突如其来的重要汇报&#xff0c;您是否曾陷入时间紧迫与完美呈现的双重困境&#xff1f;想要在短时间内打造出既全面又引人注目的可视化看板&#xff0c;却苦于设计技巧的匮乏与审美眼光的局限&#xff1f;别担心&#xff0c;JVS-BI您的智慧汇报加速器&#xff0c;正蓄势待…

Java面试宝典-WEB学习

Java web学习 目录 Java web学习 1、说说 Servlet 的基本架构 2、说一说 Servlet 的生命周期? 3、如何实现一个自定义的 servlet&#xff1f; 4、servlet中有哪些核心类&#xff1f;都有什么特点&#xff1f; 5、什么情况下调用 doGet()和 doPost()&#xff1f; 6、request.ge…

自动化测试 | UnitTest框架

1. TestCase&#xff08;测试用例&#xff09; 步骤&#xff1a; 1. 导包 import unittest 2. 新建测试类并继承 unittest.TestCase 3. 测试方法必须以test字母开头 运行&#xff1a; 1. 运行测试类所有的测试方法&#xff…

国家海洋环境预报中心李本霞:全国首个海浪智能预报系统已投入业务化运行,AI助力海浪预报多项突破

近日&#xff0c;在第 20 届 CCF HPC China 2024 大会中&#xff0c;第六届海洋数值预报与高性能计算论坛圆满举办。在本次大会上&#xff0c;国家海洋环境预报中心海浪预报室主任李本霞以「人工智能在海浪预报中的应用」为主题展开演讲&#xff0c; HyperAI超神经在不违原意的…

配置MAC地址安全

概述 MAC地址安全配置是确保网络设备和通信安全的重要措施&#xff0c;通过限制、监控和管理设备的物理地址来防止未授权访问和潜在的网络威胁。以下是对MAC地址安全的概述&#xff1a; 基本概念 定义&#xff1a;MAC地址&#xff08;Media Access Control Address&#xff09…

某音商品详情sku示例参考,API说明

以下提供某音&#xff08;即抖音&#xff09;商品详情SKU&#xff08;Stock Keeping Unit&#xff0c;库存量单位&#xff09;的示例参考以及API的详细说明&#xff1a; 一、某音商品详情SKU示例参考 在抖音电商平台中&#xff0c;商品详情页通常会展示商品的SKU信息&#xff…

线性自抗扰控制(LADRC)系统算法框图

非线性ADRC(NLADRC)详细算法框图和源代码请参考专栏系列文章,常用链接如下: 1、NLADRC自抗扰控制 NLADRC自抗扰控制从Simulink仿真到PLC控制实现_自抗扰控制器 simulink仿真-CSDN博客文章浏览阅读1.6k次,点赞2次,收藏7次。本文介绍了如何将ADRC自抗扰控制算法从Simulink…

计算机毕业设计 | vue+SpringBoot图书借阅管理系统 图书管理系统(附源码)

1&#xff0c; 概述 1.1 课题背景 随着现在科学技术的进步&#xff0c;人类社会正逐渐走向信息化&#xff0c;图书馆拥有丰富的文献信息资源&#xff0c;是社会系统的重要组成部分&#xff0c;在信息社会中作用越来越重要&#xff0c;在我国图书馆计算机等 信息技术的应用起步…

MySQL数据库表分区

1.背景 当前数据库中&#xff0c;数据库表已经存在&#xff0c;同时该数据库表的数据还在每天不断增长。因为数据库表太大&#xff0c;导致检索过程耗时&#xff0c;为提高检索效率&#xff0c;故对相关数据库表进行分区处理。 2.MySQL分区 分区就是将一个表分解成多个区块进…

补充面试知识点

jwt鉴权 实现登录流程 jwt鉴权登录实现步骤&#xff08;JWT工具类拦截器前端配置&#xff09;——前后端鉴权方案和使用_jwtsigner-CSDN博客 就是前端每一次刷新页面的时候 都判断一下发来的请求头里边的token信息 通过token识别用户信息和登录状态也就是id 线程池的执行流程 …

Visual Studio2022 Razor格式化慢

菜单&#xff1a;工具-->选项-->文本编辑器-->HTML 设置使用旧版本Razor 为True Razor文件格式化变很快

师生共评作业管理:Spring Boot系统的设计与实践

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常适…

深入理解 JDK 的 Optional 类

深入理解 JDK 的 Optional 类 深入理解 JDK 的 Optional 类1. 什么是 Optional&#xff1f;1.1 主要构造方法示例 2. Optional 的常用方法2.1 判断值是否存在示例2.2 获取值示例2.3 进行操作示例 3. 使用场景3.1 避免 null 值示例3.2 提高代码可读性3.3 与流结合示例 4. 注意事…

利用C++封装鼠标轨迹算法为DLL:游戏行为检测的利器

在现代软件开发中&#xff0c;鼠标轨迹模拟技术因其在自动化测试、游戏脚本编写等领域的广泛应用而备受青睐。本文将介绍如何使用C语言将鼠标轨迹算法封装为DLL&#xff08;动态链接库&#xff09;&#xff0c;以便在多种编程环境中实现高效调用&#xff0c;同时探讨其在游戏行…

十一长假!迷你主机小巧便携成为假期新宠。

在十.一国庆长假期间&#xff0c;出游成为许多人的首选活动&#xff0c;你是否已按捺不住内心的悸动&#xff0c;渴望一场说走就走的旅行&#xff1f;但面对繁重的行李与有限的背包空间&#xff0c;如何在享受旅途美景的同时&#xff0c;又不失娱乐与工作的便捷性&#xff1f;今…

Chrome与Firefox浏览器HTTP自动跳转HTTPS的解决方案

一、背景介绍 随着网络安全意识的不断提高&#xff0c;越来越多的网站开始采用HTTPS协议&#xff0c;以确保数据传输的安全性。然而&#xff0c;有时用户在浏览网页时&#xff0c;可能会遇到HTTP请求被自动跳转至HTTPS的情况导致网站打不开&#xff0c;提示安全问题&#xff0…

【Linux】Windows搭建CentOS7环境

【重要提示】在安装CentOS之前&#xff0c;请确保Vmware虚拟机已准备就绪 【准备工作】 一、获取CentOS 7镜像文件 首先&#xff0c;从阿里云的开源镜像站点下载CentOS 7的镜像文件&#xff0c;点击以下链接即可开始下载&#xff1a; 阿里云镜像开源 二、安装VMware Works…