leetcode LCR24反转单链表

反转单链表

题目描述

题目分析 

先来说迭代的思想:

上面next = cur->next应该放在cur->next = pre前面执行,这里笔误 

再来说递归的思想:

 题目代码

这个代码里面我加了我自己写的测试数据,自己可以去找对应的部分,直接粘贴赋值就可以在leetcode提交成功,我们就没有把迭代与递归单独分开了,里面还有大量的注释说明,请结合题目分析仔细观看

java版本

package com.pxx.test;import sun.awt.image.ImageWatched;class LinkList {private ListNode head;private int length;//长度//链表结点的一个定义static class ListNode {int value;ListNode next;//初始化一个结点public ListNode(int value) {this.value = value;this.next = null;}}public ListNode getHead() {return this.head;}//实现数据的尾插public void insertEnd(int value) {ListNode newNode = new ListNode(value);if (newNode != null) {if (head == null) {head = newNode;//指向第一个结点} else {ListNode cur = head;//移动到最后一个结点的位置while (cur.next != null) {cur = cur.next;}//最后一定是在cur加入结点cur.next = newNode;}length++;}}//打印public void printList(ListNode head) {ListNode cur = head;while (cur != null) {System.out.print(cur.value + " ");cur = cur.next;}System.out.println();}//利用递归反转链表//返回反转之后的链表头public ListNode reverse(ListNode head) {//安全检查都必须先进行操作if (head == null || head.next == null) {return head;} else {ListNode pre = head , cur = head.next;//接收最后一次的返回,就是最后一个节点,中间是没有结点要返回的//这里为什么传入pre.next,而不是cur.next//目的其实就是为了每一个值都能被链上,为什么那么说呢//1(pre) 2(cur) 3 4 5//如果按照cur.next来进行移动//1 <- 2这一部分递归了之后,就会进入 3(pre(cur会直接到3变成pre))   4(内部的cur)//那么我请问2 3中间这条线被狗吃了吗?所以以pre.next往下递归//上面pre循环到5号结点,也就是最后一组递归就要结束,因此有head.next = null就结束递归ListNode res = reverse(pre.next);cur.next = pre;//目的把第一个结点的next指向null//这里千万不能吧pre.next 与 cur.next进行比较//否则会造成最开头的两个数据一直轮替//这样来说 1  2  3  4(pre)  5(cur)假设当前指针是这样来指的//4 <- 5 此时4也还是4->5的,进入pre.next把指向变为了null(注意这是递归所以从后往前分析)//不太懂的请结合我的递归分析图来看//null <- 4 <- 5//那么就行往前递归3(pre) 4(cur) 5,也就是null <- 3 <- 4 <- 5//我们注意到一个问题就是4的pre已经在中间的时候被改向了第一个结点//那么对于1(pre) <- 2(cur)来说,1的.next又等于cur,所以1.pre = null//null <- 1 <- 2......这个时候,程序已经全部执行完if (pre.next == cur) {pre.next = null;}return res;}}//利用迭代思想实现public ListNode reverse1(ListNode head) {//空结点,直接返回一个nullif (head == null) {return null;}//定义三个指针进行迭代ListNode pre = head, cur = head.next, next;//next用于在中间轮替指针可以先不用初值//没循环之前先把第一个结点next指向nullhead.next = null;while (cur != null) {//这里迭代就是// null <- 1(pre) 2(cur) 3(next) 4        5// null <- 1 <-   2(pre) 3(cur)  4(next)  5// null <- 1 <-   2 <-   3(pre)  4(cur)   5(next)// null <- 1 <-   2 <-   3 <-    4(pre)   5(cur)   next(这个时候还会进入循环里面更改cur.next指针)//这个时候cur == null,结束,pre指向最后一个结点返回//保留next指向next = cur.next;//这一步必须放在cur.next前面,不然cur.next就被先改变了,next的位置就不对了cur.next = pre;//改变pre与curpre = cur;//这一步放在cur=next,这里就是先赋值pre,在改变curcur = next;}//最后一定是pre指向了最后一个结点return pre;}}public class Test4 {public static void main(String[] args) {LinkList linkList = new LinkList();//开始插入数据linkList.insertEnd(1);linkList.insertEnd(2);linkList.insertEnd(3);
//        linkList.insertEnd(4);
//        linkList.insertEnd(5);linkList.printList(linkList.getHead());//反转链表LinkList.ListNode head = linkList.reverse(linkList.getHead());linkList.printList(head);}
}

 c语言版本测试代码,仅做参考

#include <stdio.h>
#include <stdlib.h>// 链表结点的定义
struct ListNode {int value;struct ListNode* next;
};// 链表的定义
struct LinkedList {struct ListNode* head;int length;
};// 初始化链表
void initLinkedList(struct LinkedList* list) {list->head = NULL;list->length = 0;
}// 在链表末尾插入一个新节点
void insertEnd(struct LinkedList* list, int value) {struct ListNode* newNode = (struct ListNode*)malloc(sizeof(struct ListNode));if (newNode != NULL) {newNode->value = value;newNode->next = NULL;if (list->head == NULL) {list->head = newNode;} else {struct ListNode* cur = list->head;while (cur->next != NULL) {cur = cur->next;}cur->next = newNode;}list->length++;}
}// 打印链表的元素
void printList(struct ListNode* head) {struct ListNode* cur = head;while (cur != NULL) {printf("%d ", cur->value);cur = cur->next;}printf("\n");
}// 递归反转链表
struct ListNode* reverse(struct ListNode* head) {if (head == NULL || head->next == NULL) {return head;} else {struct ListNode* pre = head;struct ListNode* cur = head->next;struct ListNode* res = reverse(pre->next);cur->next = pre;if (pre->next == cur) {pre->next = NULL;}return res;}
}int main() {struct LinkedList linkList;initLinkedList(&linkList);// 开始插入数据insertEnd(&linkList, 1);insertEnd(&linkList, 2);insertEnd(&linkList, 3);printList(linkList.head);// 反转链表linkList.head = reverse(linkList.head);printList(linkList.head);return 0;
}

好了,祝早安,午安,晚安

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java springboot在测试类中构建虚拟MVC环境并发送请求

好 上文java springboot在测试类中启动一个web环境我们在测试类中搭了一个web环境 那么 下面就要想办法弄一个接口的测试 这边 我们还是要在controller包下去创建一个 controller类 写一个访问接口 这里 我创建一个 TestWeb.java 这里 我们编写代码如下 package com.example.…

【数据结构复习之路】树和二叉树(严蔚敏版)万字详解主打基础

专栏&#xff1a;数据结构复习之路 复习完上面四章【线性表】【栈和队列】【串】【数组和广义表】&#xff0c;我们接着复习 树和二叉树&#xff0c;这篇文章我写的非常详细且通俗易懂&#xff0c;看完保证会带给你不一样的收获。如果对你有帮助&#xff0c;看在我这么辛苦整理…

CCFCSP试题编号:202206-2试题名称:寻宝!大冒险!

一、题目 二、分析 因为藏宝图左下角位置一定是一棵树&#xff0c;所以只要把所有绿化图中每一棵树&#xff0c;与之相匹配&#xff0c;然后判断&#xff0c;是否整个藏宝图都是绿化图的一部分&#xff0c;如果是那就计数count1。所以来看&#xff0c;结果count最大也就是n(绿…

1、Docker概述与安装

相关资源网站&#xff1a; ● docker官网&#xff1a;http://www.docker.com ● Docker Hub仓库官网: https://hub.docker.com/ 注意&#xff0c;如果只是想看Docker的安装&#xff0c;可以直接往下拉跳转到Docker架构与安装章节下的Docker具体安装步骤&#xff0c;一步步带你安…

Mysql 8.0主从复制模式安装(兼容Mysql 5.7)

Mysql V8.0.35安装 官网地址&#xff1a;MySQL :: Download MySQL Community Server 下载【Mysql 8.0.35】压缩包 解压压缩包&#xff0c;仅保留6个安装文件即可 mysql-community-client-8.0.31-1.el7.x86_64.rpm mysql-community-client-plugins-8.0.31-1.el7.x86_64.rpm my…

摄影网站的技术 SEO:提示和最佳实践

摄影就是要给人留下良好的第一印象。如果你想在竞争中领先&#xff0c;摄影师的SEO是您可以采用的最佳营销方法之一。 我们都曾有过这样的经历&#xff1a;你建立了一个漂亮的作品集网站来吸引更多的业务。网站上线并在社交媒体上推广后&#xff0c;您就可以坐等了。网站访问量…

002、ArkTS

之——开发语言 目录 之——开发语言 杂谈 正文 1.TypeScript基础 1.1 基础类型 1.2 条件语句 1.3 函数 1.4 类 1.5 模块 1.6 迭代器 2.ArkTS 2.1 JAVA SCRIPT 2.2 TS 2.3 ArkTS ​编辑 3.示例 3.1 概述性示例 3.2 自定义组件 3.3 渲染控制语法 3.4 状态管…

linux升级gcc版本详细教程

0.前言 一般linux操作系统默认的gcc版本都比较低&#xff0c;例如centos7系统默认的gcc版本为4.8.5。gcc是从4.7版本开始支持C11的&#xff0c;4.8版本对C11新特性的编译支持还不够完善&#xff0c;因此如果需要更好的体验C11以及以上版本的新特性&#xff0c;需要升级gcc到一个…

P8A002-CIA安全模型-配置Linux描述网络安全CIA模型之可用性案例

【预备知识】 可用性&#xff08;Availability&#xff09; 数据可用性是一种以使用者为中心的设计概念&#xff0c;易用性设计的重点在于让产品的设计能够符合使用者的习惯与需求。以互联网网站的设计为例&#xff0c;希望让使用者在浏览的过程中不会产生压力或感到挫折&#…

F5社区学习心得分享:如何克服云迁移挑战?

伴随数字时代的快速发展&#xff0c;很多企业都会借助云迁移&#xff0c;踏上转型之旅。尽管云迁移被认为是一种能够节约成本&#xff0c;且不会影响正常运营的现代化改造举措&#xff0c;然而我们并不能低估它的复杂性。正如有研究表明&#xff0c;约有41%的企业并没有通过云迁…

JSP EL表达式之 empty

好 本文我们还是继续说EL表达式 我们来讲一个非空判断的好手 empty 我们直接编写代码如下 <% page contentType"text/html; charsetUTF-8" pageEncoding"UTF-8" %> <%request.setCharacterEncoding("UTF-8");%> <!DOCTYPE html&…

基于GPRS的汽车碰撞自动报警系统(论文+源码)

1. 系统设计 本次基于GPRS的汽车碰撞自动报警系统的设计中&#xff0c;其主要的目标功能如下&#xff1a;1、实时检测当前的GPS精度和纬度坐标&#xff1b;2.当发生碰撞后系统自动将当前的信息通过GPRS数据发送到远端数据进行报警&#xff1b;3、系统在碰撞后一方面进行本地报警…

补充:如何提高selenium的运行速度?

已经通读该专栏文章的同学,或许对UI自动化测试有了一定的掌握,细心的同学肯定会发现一个问题,当用例量达到一定程度时,对于整体用例的执行速度肯定不会很满意。除了应用多线程运行用例的方式加快速度,有没有其他的方法呢? 今天告诉大家,方法是有的!也是本人新学的。即…

【开源】基于Vue+SpringBoot的农家乐订餐系统

项目编号&#xff1a; S 043 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S043&#xff0c;文末获取源码。} 项目编号&#xff1a;S043&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用户2.2 管理员 三、系统展示四、核…

【技术分享】RK3399 Ubuntu通过Python实现录音和播放功能

​本文基于IDO-SBC3968 Ubuntu 系统通过Python脚本实现录音和播放功能。 IDO-SBC3968采用RK3399国产六核64位CPU高性能处理器&#xff0c;支持4K HDMI2.0显示&#xff0c;接口丰富&#xff0c;拥有千兆以太网&#xff0c;全协议TypeC接口&#xff0c;USB3.0 &#xff0c;eDP 和…

Vue3+Vite+TypeScript常用项目模块详解

目录 1.Vue3ViteTypeScript 概述 1.1 vue3 1.1.1 Vue3 概述 1.1.2 vue3的现状与发展趋势 1.2 Vite 1.2.1 现实问题 1.2 搭建vite项目 1.3 TypeScript 1.3.1 TypeScript 定义 1.3.2 TypeScript 基本数据类型 1.3.3 TypeScript语法简单介绍 2. 项目配置简单概述 2.…

Java 简易版王者荣耀

所有包和类 GameFrame类 package newKingOfHonor;import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.io.File; import java.util.ArrayList;im…

电源控制系统架构(PCSA)之系统分区电源域

目录 4.2 电源域 4.2.1 电源模式 4.2.2 电源域的选择 4.2.3 系统逻辑 4.2.4 Always-On域 4.2.5 处理器Clusters 4.2.6 CoreSight逻辑 4.2.7 图像处理器 4.2.8 显示处理器 4.2.9 其他功能 4.2.10 电源域层次结构要求 4.2.11 SOC域示例 4.2 电源域 电源域在这里被定…

Java魔法解密:HashMap底层机制大揭秘

文章目录 一、 源码深度解析1.1 窥探Java集合框架中的设计思想1.2 逐行解读HashMap的源代码1.2.1 类信息1.2.2 常量属性1.2.3 变量属性1.2.4 节点信息1.2.5 构造方法1.2.6 put方法1.2.6.1 putVal方法1.2.6.2 putTreeVal方法1.2.6.3 tieBreakOrder方法1.2.6.4 treeifyBin方法1.2…

Less 安装教程

文章目录 前言LESS的系统要求安装LESS例子输出Less编译css工具后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;Sass和Less &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术需要掌握&#xff0c;正在不断努力填补技术短板…