目录

1、迭代法

2、递归方式


反转链表:

输入:1->2->3->4->5
输出:5->4->3->2->1

1、迭代法

思路:遍历整个链表,当链表不为空时,每次取链表的第一个Node作为当前节点,修改当前Node的指针,重复此步骤,步骤解析如下:

Java代码的具体实现步骤

    public static ListNode reverseNode_1(ListNode node) {ListNode previous = null, current, next;current = node;// 如果当前node不为空,遍历链表while (current != null) {// 保存当前节点的链接next = current.next;// 修改当前节点的链接,更改为指向之前的节点current.next = previous;// 修改之前的节点的值为当前节点previous = current;// 修改当前节点的值,继续向下遍历current = next;}return previous;}

2、递归方式

思路:使用递归,需要满足递归需要的条件

(1)终止递归的条件:当Node为空,或者Node.next为空(只有一个节点),则递归终止,返回当前Node

(2)终止递归的处理方法:return 当前 Node

(3)重复逻辑:修改当前节点的下一个节点的指针->指向当前节点;当前节点的指针指向Null

所以,递归的流程入下:重复把当前节点的下一个节点的指针->指向当前节点;然后把当前节点的指针指向Null(破环)

Java代码的实现如下:

    public static ListNode reverseNode_2(ListNode node) {// 终止条件和终止方法if (node == null || node.next == null) {return node;}// 把node替换为node.next继续向下寻找ListNode new_node = reverseNode_2(node.next);// 反转指针:每一个节点都执行此操作node.next.next = node;// 不用担心断开,因为后续步骤都会为node.next赋值,当前步骤保持为null就好node.next = null;return new_node;}

下边,对于递归具体的步骤,给出详细的步骤说明:

首先,当递归到节点(5)时,因为(5)的下一个节点是Null,所以 5->Null 会直接返回,当递归到节点(4)时,此时当前节点为 4->5->Null ,在此节点指针修改之前,new_node 仍旧为 5->Null (前一次递归返回)。

然后,开始修改指针,依次执行下边代码

// 修改(4)的下一个节点(5)的next指针由Null指向(4)
node.next.next = node;
// 修改(4)节点的next指针由(5)指向Null
node.next = null;

修改后,节点(4)变成了 4->Null,new_node 节点变成 5->4->Null,并且把 new_node 返回,图示如下:

重复以上步骤,直到结束递归。

完整的Java代码如下

/*** @author swadian* @date 2022/5/8* @Version 1.0* @describetion 反转链表*/
public class ReverseListNode {// 链表static class ListNode {int val; // value值ListNode next; // 指针public ListNode(int val, ListNode next) {this.val = val;this.next = next;}@Overridepublic String toString() {return "(" + val + "-> " + next + ')';}}/*** 输入:1-2-3-4-5* 输出:5-4-3-2-1*/public static void main(String[] args) {ListNode listNode = prepareListNode();ListNode node1 = reverseNode_1(listNode);ListNode node2 = reverseNode_2(listNode);}/*** 迭代思想* 输入:1-2-3-4-5 : (1,->2),(2,->3),(3,->4),(4,->5),(5,->null)* 输出:5-4-3-2-1 : (5,->4),(4,->3),(3,->2),(2,->1),(1,->null)*/public static ListNode reverseNode_1(ListNode node) {ListNode previous = null, current, next;current = node;// 如果当前node不为空,遍历链表while (current != null) {// 保存当前节点的链接next = current.next;// 修改当前节点的链接,更改为指向之前的节点current.next = previous;// 修改之前的节点的值为当前节点previous = current;// 修改当前节点的值,继续向下遍历current = next;}return previous;}// 递归public static ListNode reverseNode_2(ListNode node) {// 终止条件和终止方法System.out.println(node);if (node == null || node.next == null) {return node;}// 把node替换为node.next继续向下寻找ListNode new_node = reverseNode_2(node.next);// 反转指针:每一个节点都执行此操作node.next.next = node;// 不用担心断开,因为后续步骤都会为node.next赋值,当前步骤保持为null就好node.next = null;return new_node;}public static ListNode prepareListNode() {ListNode node5 = new ListNode(5, null);ListNode node4 = new ListNode(4, node5);ListNode node3 = new ListNode(3, node4);ListNode node2 = new ListNode(2, node3);ListNode node1 = new ListNode(1, node2);return node1;}
}

反转链表的Java实现相关推荐

  1. 【剑指offer】面试题24:反转链表(Java 实现)

    输入一个链表,反转链表后,输出新链表的表头. 代码: package offer; class Node4 {     int val;     Node4 next = null;     Node ...

  2. 【剑指offer】面试题24:反转链表(Java)

    定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3-&g ...

  3. 【LeetCode笔记】206. 反转链表(Java、迭代、递归、链表)

    啊好久没更文了,前两天状态不太好.还是要坚持更文敲题噢! 文章目录 题目描述 思路 & 代码 题目描述 面试高频题,需要会用两种方法解决!(迭代 and 递归) 其实先写出迭代,递归就不难写了 ...

  4. 《LeetCode力扣练习》剑指 Offer 24. 反转链表 Java

    <LeetCode力扣练习>剑指 Offer 24. 反转链表 Java 一.资源 题目: 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点. 示例: 输入: 1-& ...

  5. 《LeetCode力扣练习》第206题 反转链表 Java

    <LeetCode力扣练习>第206题 反转链表 Java 一.资源 题目: 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表. 示例 1: 输入:head = [1,2, ...

  6. [Leedcode][JAVA][第25题][K个一组反转链表][链表][递归]

    [问题描述][第25题][K个一组反转链表][困难] 时间复杂度:O(N^2) 空间复杂度:O(1) ```java 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表.k 是一个正整数, ...

  7. java 链表反转_面试必备 | 不可不会的反转链表

    反转链表这题真的是面试非常喜欢考的了,这题看起来简单,但是能用两种方法一遍 bug free 也是不容易的,面试的时候可以筛下来一大批人,无论是对 junior 还是 senior 面试都很爱考.今天 ...

  8. 链表之反转链表,万金油的解题方法(java求解)

    链表之反转链表,一招鲜吃遍天(java求解) 内容目录 链表之反转链表,一招鲜吃遍天(java求解) 解题万金油 栗子1:反转整个链表 栗子2:反转某个区间内的链表 栗子3:按照k为一组,反转某个区间 ...

  9. Java - 反转链表

    目标是反转链表,效果如下: 观察要实现以上效果,需要达成什么条件,然后挨个拆解: 需要一个链表 链表遍历 反转函数 测试用例 那么ok,挨个实现以上条件即可 1.构造链表:链表是一种递归结构,每一个节 ...

  10. 【JAVA】PAT 乙级 1025 反转链表(测试点5超时,牛客网通过)

    [JAVA]PAT 乙级 1025 反转链表(测试点5超时,牛客网通过) 题目链接 给定一个常数 K 以及一个单链表 L,请编写程序将 L 中每 K 个结点反转.例如:给定 L 为 1→2→3→4→5 ...

最新文章

  1. Spring Boot实战:过滤器、拦截器与切片
  2. 怎么自学python自动化测试-学习自动化测试,如何学习Python语言?
  3. VC,Windbg,gdb执行到指定代码行方法
  4. zigbee的路由器能分配网络地址吗_网络基础知识学习 小白也能变专家
  5. 多线程,线程同步,synchronized关键字的用法
  6. 【Tiny4412】使用dnw烧写内核
  7. 【C++】智能指针简述(五):解决循环引用的weak_ptr
  8. mysql 查询 汇总_Mysql-Sql查询汇总
  9. vue 懒人_Vue.js 中的实用工具方法【推荐】
  10. 获取设置套接字选项:getsockopt, setsockopt
  11. 邮件标题乱码问题解决一例
  12. 截取字符串_妙用字符串的替换和截取让Shell脚本精准得到你心中的那个“她”...
  13. Struts2中过滤器和拦截器的区别
  14. JQuery.BlockUI弹框插件
  15. CS231n Assiganment#1-KNN 代码解析
  16. 去除Ubuntu 20桌面图标的快捷方式箭头
  17. 苹果手机里微信数据删除怎么恢复?
  18. oracle11g ora12170,11g告警日志中大量ORA-12170错误
  19. SAP CO TCode
  20. 上传截断_文件上传路径截断实例

热门文章

  1. linux环境下,集群中Hadoop版本更换
  2. 【帆软FR】新增自定义字体(以LED字体为例)
  3. 顶层设计:为智慧城市描画建设“蓝图”
  4. android 打开文件管理器选择文件
  5. Ubuntu20.04安装输入法
  6. 光学设计知识总结(ZEMAX预备知识)
  7. Agilent/安捷伦N6705B直流电源分析仪
  8. mysql创建表代码_MySQL------代码建表
  9. HMC5883L电子罗盘/指南针实现,附带校准方法(附STM32 源码)
  10. MapGIS数据中心是什么?