单链表的反转?太细了哥们!细到离谱!

单链表的反转(面试常出):

​ 单链表的反转,可以通过很多种方法实现。包括迭代法,递归法,

  • 迭代法:

    1. 定义三个指针:prev、current和next,它们分别表示前一个节点、当前节点和下一个节点。

    2. 初始化时,prev为null,current为头节点。

    3. 在循环中,不断将current的next指针指向prev,然后依次向后移动prev、current和next指针。

    4. 当next为空时,说明已经到达链表末尾,此时的prev指向就是反转后的头节点。

    其实就像是先将第一个节点指向null,就像最后一个节点它也是next = null的;然后一直这样子重复,转一次就后退,让下一个节点去转方向指向前面的。

    在这里插入图片描述

    public ListNode reverse(Node head) {
            Node prev = null;
            Node current = head;
    
            while (current != null) {
                Node nextTemp = current.next; // 暂存当前节点的下一个节点
                current.next = prev; // 将当前节点指向前一个节点
                prev = current; // 更新prev为当前节点
                current = nextTemp; // 更新current为原先的下一个节点
            }
    
            return prev; // 返回反转后的头节点
        }
    

    // 补充一个力扣第92题,加深理解(让你把单链表部分元素反转,其他部分不变)

  • 在这里插入图片描述

​ 这里依旧可以使用迭代的方法,就是要先通过遍历去找到反转开始的位置和结束的位置;用辅助节点记录反转区间的前置节点和反转区间的尾节点。然后反转区间的链表反转即可,反转后接上前面的部分。

在这里插入图片描述

public ListNode reverseBetween(ListNode head, int left, int right) {
    ListNode current = head;
    ListNode prev = null;
    for (int i = 1; i < left; i++) {
        prev = current;
        current = current.next;
    }
    // 反转区间的前置节点
    ListNode tailPrev = prev;
    // 反转区间的尾节点
    ListNode tail = current;
    // 同样的迭代原理,只是范围要自定义。
    for (int j = left; j <= right; j++) {
        ListNode newTemp = current.next;
        current.next = prev;
        prev = current;
        current = newTemp;
    }
    // 反转区间的头节点
    ListNode headReverse = prev;
    tail.next = current;
    if (tailPrev != null) {
        tailPrev.next = headReverse;
        return head;
    } else {
        return headReverse;
    }
}

递归法:(也是力扣第206题)

​ 递归的关键是看整体,找出整体的大块东西。可以先写一个伪代码过一遍思路。你就写基础情况,然后要的操作,再看子问题(递归调用)放的位置即可。

**实操技巧:**第一步先找到可以看作整体的,就是原理一样的。去设计递归调用(超级操作),第二步去设计微操作,去看一份整体的怎么实现即可。后面就去找到题目中的基础情况,它相当于最里面的超级操作了,也基本就是剩下一个的情况那种。

相关概念:

​ 1.首先先明确函数的意义,还要原问题和子问题。在这里原问题是给整个链表反转,子问题是给每一个字节进行反转。

​ 2.基础情况,也就是要找到结束的条件。就是当数据规模很小的时候,能结束递归,返回答案。

​ 3.递归调用(超级操作),怎么搞定中间的递归操作。但是!唉!人脑进去递归出不来的。所以得完把递归的过程看成一个整体,不要去想里面怎么运行的。

​ 4.微操作。也就是操作的方法。

​ 比如汉诺塔问题,你有2个叠在一起的时候,就是先把小的放中间,大的放右边,再把小的放大的上面。那这个时候,假如他有一堆,你就是把小的一堆给放到中间,让最大的去到最右边垫底。然后小的一堆整体放到大的上面。而那一堆小的移动其实就是整个问题的子问题,它其实就是可以用递归重复一个原理完成。

此题思路如下:

在这里插入图片描述

// 定义:输入一个单链表头结点,将该链表反转,返回新的头结点
ListNode reverse(ListNode head) {
    // 基础情况,也就是结束的代码。
    // 链表为空或者只有一个节点时,直接返回头节点即可。
    if (head == null || head.next == null) {
        return head;
    }
    // 递归调用(超级操作)
    ListNode last = reverse(head.next);
    // 而其实当你写一个伪代码时候,你也可以发现。下面的这个其实就是反转需要的的操作,可以写一个伪代码,微操作。具体操作方法: operate(head.next); 
    head.next.next = head;
    head.next = null;
    return last;
}

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

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

相关文章

【黑马甄选离线数仓day04_维度域开发】

1. 维度主题表数据导出 1.1 PostgreSQL介绍 PostgreSQL 是一个功能强大的开源对象关系数据库系统&#xff0c;它使用和扩展了 SQL 语言&#xff0c;并结合了许多安全存储和扩展最复杂数据工作负载的功能。 官方网址&#xff1a;PostgreSQL: The worlds most advanced open s…

中国企业500强的排名也在不断变化。面对不确定性的挑战,企业如何应对?

随着全球经济的不断发展和变化&#xff0c;中国企业500强的排名也在不断变化。面对不确定性的挑战&#xff0c;企业如何应对&#xff1f;在本文中&#xff0c;挖数据平台将提供数据源探讨中国企业500强在应对不确定性方面的突围与变革。 一、数据挖掘与分析 从2006年到2023年&…

【科普知识】什么是步进电机?

德国百格拉公司于1973年发明了五相混合式步进电机及其驱动器&#xff0c;1993年又推出了性能更加优越的三相混合式步进电机。我国在80年代以前&#xff0c;一直是反应式步进电机占统治地位&#xff0c;混合式步进电机是80年代后期才开始发展。 步进电机是一种用电脉冲信号进行…

CAN实验

CAN 寄存器 HAL库函数 代码 #include "./BSP/CAN/can.h"CAN_HandleTypeDef g_can1_handle; CAN_TxHeaderTypeDef g_can1_txheader; CAN_RxHeaderTypeDef g_can1_rxheader;/* STM32F103 TS1 8 TS2 7 BRP 3 波特率&#xff1a;36000 / [(9 8 1) * 4] 500Kbps …

数据结构-树-二叉树-堆的实现

1.树概念及结构 树是一种 非线性 的数据结构&#xff0c;它是由 n &#xff08; n>0 &#xff09;个有限结点组成一个具有层次关系的集合。 把它叫做树是因 为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的 。 有一个特殊的结点&#xff…

[chroot+seccomp逃逸] THUCTF2019 之 固若金汤

题目分析 附件为一个源码, 其中注释我都写好了, 主要就讲关键的知识点. #define _GNU_SOURCE#include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <string.h> #include <errno.h> #include <sched.h> #include <uni…

【蓝桥杯省赛真题47】Scratch小猫踩球 蓝桥杯scratch图形化编程 中小学生蓝桥杯省赛真题讲解

目录 scratch小猫踩球 一、题目要求 编程实现 二、案例分析 1、角色分析

flutter之graphic图表自定义tooltip

renderer graphic中tooltip的TooltipGuide类提供了renderer方法&#xff0c;接收三个参数Size类型&#xff0c;Offset类型&#xff0c;Map<int, Tuple>类型。可查到的文档是真的少&#xff0c;所以只能在源码中扒拉例子&#xff0c;做符合需求的修改。 官方github示例 …

【TypeScript】常见数据结构与算法(二):链表

文章目录 链表结构&#xff08;LinkedList&#xff09;链表以及数组的缺点数组链表的优势 什么是链表?封装链表相关方法源码链表常见面试题237-删除链表中的节点206 - 反转链表 数组和链表的复杂度对比 链表结构&#xff08;LinkedList&#xff09; 链表以及数组的缺点 链表…

数据库-MySQL之数据库必知必会10-13章

第10章 创建计算字段 拼接字段 使用Concat()函数 执行算术计算 示例&#xff1a;从 Products 表中返回 prod_id、prod_price 和 sale_price。sale_price 是一个包含促销价格的计算字段。提示&#xff1a;可以乘以 0.9&#xff0c;得到原价的 90%&#xff08;即 10%的折扣&…

手机APP-MCP走蓝牙无线遥控智能安全帽~执法记录仪~拍照录像,并可做基础的配置,例如修改服务器IP以及配置WiFi等

手机APP-MCP走蓝牙无线遥控智能安全帽~执法记录仪~拍照录像,并可做基础的配置,例如修改服务器IP以及配置WiFi等 手机APP-MCP走蓝牙无线遥控智能安全帽~执法记录仪~拍照录像,并可做基础的配置,例如修改服务器IP以及配置WiFi等&#xff0c; AIoT万物智联&#xff0c;智能安全帽…

Docker的项目资源参考

Docker的项目资源包括以下内容&#xff1a; Docker官方网站&#xff1a;https://www.docker.com/ Docker Hub&#xff1a;https://hub.docker.com/ Docker文档&#xff1a;https://docs.docker.com/ Docker GitHub仓库&#xff1a;https://github.com/docker Docker官方博客…

C#,《小白学程序》第二课:数组,循环与排序

1 什么是数组&#xff1f; 数组 Array 是一组数值&#xff08;数 或 值&#xff09;。 int[] a; int[,] b; int[][] c; Anything[] d; 都是数组。 2 排序 排序就是按大小、名字、拼音或你指定的信息进行比较后排队。 排序是数组最基本的功能需求。 3 文本格式 /// <summa…

使用v-md-editor开发sql查看器--实战

v-md-editor markdown编辑器 文档&#xff1a;https://code-farmer-i.github.io/vue-markdown-editor/zh/ echo 创建一个空目录&#xff0c;使用vscode打开此空目录&#xff0c;进入终端&#xff0c;输入如下命令 npm create vitelatest . -- --template vue echo 选择 vue 和 …

Log4j2.xml不生效:WARN StatusLogger Multiple logging implementations found:

背景 将 -Dlog4j.debug 添加到IDEA的类的启动配置中 运行上图代码&#xff0c;这里log4j2.xml控制的日志级别是info&#xff0c;很明显是没生效。 DEBUG StatusLogger org.slf4j.helpers.Log4jLoggerFactory is not on classpath. Good! DEBUG StatusLogger Using Shutdow…

应用内测分发平台如何上传应用包体?

●您可免费将您的应用&#xff08;支持苹果.ios安卓.apk文件&#xff09;上传至咕噜分发平台&#xff0c;我们将免费为应用生成下载信息&#xff0c;但咕噜分发将会对应用的下载次数进行收费&#xff08;每个账号都享有免费赠送的下载点数以及参加活动的赠送点数&#xff09;&a…

pat实现基于邻接表表示的深度优先遍历[含非递归写法]

文章目录 1.递归2.非递归 1.递归 void DFS(ALGraph G, int v) {visited[v] 1;printf("%c ", G.vertices[v].data);for (ArcNode* cur G.vertices[v].firstarc; cur ! nullptr; cur cur->nextarc){if (!visited[cur->adjvex])DFS(G, cur->adjvex);} }2.非…

Maven - 打包之争:Jar vs. Shade vs. Assembly

文章目录 Pre概述Jar 打包方式_maven-jar-pluginOverview使用官方文档 Shade 打包方式_maven-shade-pluginOverview使用将部分jar包添加或排除将依赖jar包内部资源添加或排除自动将所有不使用的类排除将依赖的类重命名并打包进来 &#xff08;隔离方案&#xff09;修改包的后缀…

【VSCode】VSCode 使用

目录 文章目录 目录插件配置设置代码不显示 git 提示 "xxx months ago | 1 author"设置打开项目不自动选择 CMakeLists 插件 以下插件为 C 开发偏好设置。 C/CCMakeCMake ToolsGitLensRemote DevelopmentRemote Explorer 配置 设置代码不显示 git 提示 “xxx mon…

基于java实现捕鱼达人游戏

开发工具eclipse,jdk1.8 文档截图&#xff1a; package com.qd.fish;import java.awt.Graphics; import java.awt.image.BufferedImage; import java.util.Random;public class Fish {//定义鱼的图片BufferedImage fishImage;//定义鱼的数组帧BufferedImage[] fishFrame;//…