反转链表 Java版 图文并茂思路分析带答案(力扣第206题)
反转链表
力扣第206题
我们不只是简单的学习(背诵)一个数据结构,而是要分析他的思路,以及为什么要有不同的指针等等
非递归方式:
思路分析:首先要链表有个头指针没有任何问题

然后,我们要将1的下一个节点指向空,这样才能将其反转过来,但是这个时候我们发现和下一个节点2失去了联系

所以我们要有一个指针,在1还没有将next指向空前,记录下2的位置。所以我们用一个next指针记录2。并为了好理解,将head改名为cur代表当前节点。

因此,我们只要将cur的指向下一个节点的指针指向空之后,便将cur和next指针同时向后移动。

不过这样我们发现,我们cur和前面的节点失去了联系,就不能将节点2指向1了,所以我们还要有一个指针负责记录前一个节点,我们就叫它pre吧,那么再来考虑pre指针最开始应该放在哪呢,其实只要指向最左边的那个NULL就好了。

因此我们刚刚是将1指向NULL,现在改成将cur指向pre即可,就像这样。

然后我们就可以将这三个指针都向后移动,重复上一步和本步操作,直到cur为null结束即可。

递归方式:
首先是写出递归的最后答案,也就是所谓的递归出口,毫无疑问是返回第一个节点head
if (head == null || head.next==null)
return head;
再调用一次递归函数
reverseListRecursive(head.next);
直接从宏观的角度上看,肯定是将head.next之后的所有节点都反转过来了,就像下图所示,其中1被挡住了不要在意。
重点来了,如何将最后的节点2指向节点1,并将节点1指向空?

其实用两行代码实现即可,将head.next(节点2).next(NULL)指向节点1,也就是 = head即可
然后再将节点1指向空,也即head.next = null;
head.next.next = head;
head.next = null;
力扣答案总结:
我们来具体实现一下吧,其中的reverseList内的代码即是力扣答案
/**
* @Author: 翰林猿
* @Description: 反转链表
**/
public class ReverseListNode {
//非递归方式
public ListNode reverseList(ListNode head) {
//初始化三个指针,其中latter要在过程中指定,因为有可能cur为空,导致latter为空
ListNode pre = null;
ListNode cur = head;
while (cur != null) {
ListNode latter = cur.next;
//将cur指向pre
cur.next = pre;
//三个指针都向后移动,其中pre和cur在这里移动,latter在第一句会自行移动。
pre = cur;
cur = latter;
}
return pre;
}
//递归方式
public ListNode reverseListRecursive(ListNode head) {
if (head == null || head.next==null)
return head;
ListNode rev = reverseListRecursive(head.next); //最后会获取到head
head.next.next = head;
head.next = null;
return rev;
}
public static void main(String[] args) {
ListNode head = new ListNode(1);
head.next = new ListNode(2);
head.next.next = new ListNode(3);
head.next.next.next = new ListNode(4);
head.next.next.next.next = new ListNode(5);
ListNode node = new ReverseListNode().reverseList(head);
System.out.println("反转后的第一个节点值应当为5 = "+node.val);
ListNode node2 = new ReverseListNode().reverseListRecursive(head);
System.out.println("递归反转后的第一个节点值应当为5 = "+node.val);
}
}
class ListNode {
int val;
ListNode next;
ListNode() {
}
ListNode(int val) {
this.val = val;
}
ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
}
反转链表 Java版 图文并茂思路分析带答案(力扣第206题)的更多相关文章
- 《剑指offer》面试题16 反转链表 Java版
(输入链表的头节点,反转链表) 书中方法:对于一个链表,我们只能从头往后遍历,如果要反转,我们需要更改当前节点的next域指向前一个节点,此时链表断开,为了能继续修改下一个节点的next域,我们还要维 ...
- PAT 1025 反转链表 (25)(STL-map+思路+测试点分析)
1025 反转链表 (25)(25 分) 给定一个常数K以及一个单链表L,请编写程序将L中每K个结点反转.例如:给定L为1→2→3→4→5→6,K为3,则输出应该为3→2→1→6→5→4:如果K为4, ...
- 剑指Offer:面试题16——反转链表(java实现)
问题描述 定义一个函数,输入一个链表的头结点,反转该链表并输出反转后的链表的头结点.链表结点如下: public class ListNode { int val; ListNode next = n ...
- 15.反转链表 Java
题目描述 输入一个链表,反转链表后,输出新链表的表头. 思路 本题的关键就是在于对next域的赋值,同时对下一个节点进行保存,然后对把下一个节点赋给新的节点,这样依次循环完所有的节点.每次使新插入的节 ...
- PAT-basic-1025 反转链表 java c++
一.题目 给定一个常数 K 以及一个单链表 L,请编写程序将 L 中每 K 个结点反转.例如:给定 L 为 1→2→3→4→5→6,K 为 3,则输出应该为 3→2→1→6→5→4:如果 K 为 4, ...
- 《剑指offer》面试题5 从尾到头打印链表 Java版
书中方法一:反转应该立刻想到栈,利用一个栈完成链表的反转打印,但是用了额外的O(n)空间. public void printFromTail(ListNode first){ Stack<Li ...
- 《剑指offer》面试题17 合并两个排序的链表 Java版
我的方法:新初始化一个链表头,比较两个链表当前节点的大小,然后连接到该链表中.遍历两个链表直到null为止. public ListNode merge(ListNode first, ListNod ...
- 用递归调用实现字符串反转(java版)
写一个函数,输入int型,返回整数逆序后的字符串.如:输入123,返回“321”. 要求必须用递归,不能用全局变量,输入必须是一个参数,必须返回字符串. public static String re ...
- 吐血整理!2万字Java基础面试题(带答案)请收好!
熬夜整理了这么多年来的Java基础面试题,欢迎学习收藏,手机上可以点击这里,效果更佳https://mp.weixin.qq.com/s/ncbEQqQdJo0UaogQSgA0bQ 1.1 Hash ...
- 50道Java线程面试题分析及答案
下面是Java线程相关的热门面试题,你可以用它来好好准备面试. 1) 什么是线程?线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程 ...
随机推荐
- 来自jackson的灵魂一击:@ControllerAdvice就能保证万无一失吗?
前几天写了篇关于fastjson的文章,<fastjson很好,但不适合我>.里面探讨到关于对象循环引用的序列化问题.作为spring序列化的最大竞品,在讨论fastjson的时候肯定要对 ...
- Flask+Gunicorn+Nginx配置多个app
请自行安装好nginx.gunicorn和flask的运行环境,这里不再赘述 Nginx配置 修改nginx的配置 vi /etc/nginx/sites-available/default //de ...
- 学习关于JavaScript常用的8大设计模式
JavaScript 常用的8大设计模式有 工厂模式:工厂模式是一种创建对象的模式,可以通过一个共同的接口创建不同类型的对象,隐藏了对象的创建过程. 单例模式:单例模式是一种只允许实例化一次的对象模式 ...
- odoo 开发入门教程系列-约束(Constraints)
约束(Constraints) 上一章介绍了向模型中添加一些业务逻辑的能力.我们现在可以将按钮链接到业务代码,但如何防止用户输入错误的数据?例如,在我们的房地产模块中,没有什么可以阻止用户设置负预期价 ...
- 万字长文,带你彻底搞懂 HTTPS(文末附实战)
大家好,我是满天星,欢迎来到我的技术角落,本期我将带你一起来了解 HTTPS. 前言 其实网上写 HTTPS 的文章也不少了,但是不少文章都是从原理上泛泛而谈,只讲概念,没有讲原因,作为小白,看完还是 ...
- Qt5.9 UI设计(七)——统一样式设计
前言 前面已经将UI设计部分实现,各页面也做了最简单的设计,本章介绍一下qss样式的使用.样式设计最终的显示效果如下图: 操作步骤 将stylesheet.qss 样式文件添加进工程 styleshe ...
- TEC-6计算机组成原理实验(简图)
TEC-6计算机组成原理实验
- R的基本用法2
title: "Lectures" author: '01' date: "2022-09-23" output: pdf_document knitr::op ...
- RTP分包模式(H264/H265)
在rfc6184-h264文档5.4章节有详细说明.以及rfc7798-h265文档4.2章节中也有部分介绍. 一.NALU Header ● H264 NALU Header(1 byte)结构图如 ...
- 聚合短信PHP代码示例短信接口调用CURL方法
聚合的短信相信大家已经做多了吧,网上的代码看了下就是感觉太繁琐了,不过网上的也是比较好的,用的是post方法,更安全,因我们的项目是在服务器上请求,又绑定了白名单 ,所以弄了个简单点的自己用,参考如下 ...