反转链表的Java实现
目录
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实现相关推荐
- 【剑指offer】面试题24:反转链表(Java 实现)
输入一个链表,反转链表后,输出新链表的表头. 代码: package offer; class Node4 { int val; Node4 next = null; Node ...
- 【剑指offer】面试题24:反转链表(Java)
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3-&g ...
- 【LeetCode笔记】206. 反转链表(Java、迭代、递归、链表)
啊好久没更文了,前两天状态不太好.还是要坚持更文敲题噢! 文章目录 题目描述 思路 & 代码 题目描述 面试高频题,需要会用两种方法解决!(迭代 and 递归) 其实先写出迭代,递归就不难写了 ...
- 《LeetCode力扣练习》剑指 Offer 24. 反转链表 Java
<LeetCode力扣练习>剑指 Offer 24. 反转链表 Java 一.资源 题目: 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点. 示例: 输入: 1-& ...
- 《LeetCode力扣练习》第206题 反转链表 Java
<LeetCode力扣练习>第206题 反转链表 Java 一.资源 题目: 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表. 示例 1: 输入:head = [1,2, ...
- [Leedcode][JAVA][第25题][K个一组反转链表][链表][递归]
[问题描述][第25题][K个一组反转链表][困难] 时间复杂度:O(N^2) 空间复杂度:O(1) ```java 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表.k 是一个正整数, ...
- java 链表反转_面试必备 | 不可不会的反转链表
反转链表这题真的是面试非常喜欢考的了,这题看起来简单,但是能用两种方法一遍 bug free 也是不容易的,面试的时候可以筛下来一大批人,无论是对 junior 还是 senior 面试都很爱考.今天 ...
- 链表之反转链表,万金油的解题方法(java求解)
链表之反转链表,一招鲜吃遍天(java求解) 内容目录 链表之反转链表,一招鲜吃遍天(java求解) 解题万金油 栗子1:反转整个链表 栗子2:反转某个区间内的链表 栗子3:按照k为一组,反转某个区间 ...
- Java - 反转链表
目标是反转链表,效果如下: 观察要实现以上效果,需要达成什么条件,然后挨个拆解: 需要一个链表 链表遍历 反转函数 测试用例 那么ok,挨个实现以上条件即可 1.构造链表:链表是一种递归结构,每一个节 ...
- 【JAVA】PAT 乙级 1025 反转链表(测试点5超时,牛客网通过)
[JAVA]PAT 乙级 1025 反转链表(测试点5超时,牛客网通过) 题目链接 给定一个常数 K 以及一个单链表 L,请编写程序将 L 中每 K 个结点反转.例如:给定 L 为 1→2→3→4→5 ...
最新文章
- Spring Boot实战:过滤器、拦截器与切片
- 怎么自学python自动化测试-学习自动化测试,如何学习Python语言?
- VC,Windbg,gdb执行到指定代码行方法
- zigbee的路由器能分配网络地址吗_网络基础知识学习 小白也能变专家
- 多线程,线程同步,synchronized关键字的用法
- 【Tiny4412】使用dnw烧写内核
- 【C++】智能指针简述(五):解决循环引用的weak_ptr
- mysql 查询 汇总_Mysql-Sql查询汇总
- vue 懒人_Vue.js 中的实用工具方法【推荐】
- 获取设置套接字选项:getsockopt, setsockopt
- 邮件标题乱码问题解决一例
- 截取字符串_妙用字符串的替换和截取让Shell脚本精准得到你心中的那个“她”...
- Struts2中过滤器和拦截器的区别
- JQuery.BlockUI弹框插件
- CS231n Assiganment#1-KNN 代码解析
- 去除Ubuntu 20桌面图标的快捷方式箭头
- 苹果手机里微信数据删除怎么恢复?
- oracle11g ora12170,11g告警日志中大量ORA-12170错误
- SAP CO TCode
- 上传截断_文件上传路径截断实例