Java实现单向链表反转

Java实现单向链表反转

1. 题目描述

给你一个单向链表的头节点,将这个链表反转。

例如:原链表为 1 --> 2 --> 3 --> 4,则反转后的链表为 4 --> 3 --> 2 --> 1。

2. 算法思路

我们可以让当前节点的 next 指针指向它前面的节点,由于单向链表没有指向前驱结点的指针,因此我们需要事先存储它前面的结点。在更改当前节点的 next 指针之前,还需要事先存储它后面的节点,以便在修改 next 指针之后能够继续遍历。

3. Java代码实现

public class ListNode {
    int val;
    ListNode next;
    ListNode(int x) { val = x; }
}

public class Solution {
    // 单向链表反转
    public ListNode reverseList(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }
        ListNode p = null, q = null;
        while (head != null) {
            q = head.next;
            head.next = p;
            p = head;
            head = q;
        }
        return p;
    }
}

4. 示例说明

示例一

原链表为 1 --> 2 --> 3 --> 4,执行代码:

ListNode node1 = new ListNode(1);
ListNode node2 = new ListNode(2);
ListNode node3 = new ListNode(3);
ListNode node4 = new ListNode(4);

node1.next = node2;
node2.next = node3;
node3.next = node4;

ListNode reverseNode = new Solution().reverseList(node1);

while (reverseNode != null) {
    System.out.print(reverseNode.val + " ");
    reverseNode = reverseNode.next;
}

输出结果为:4 3 2 1

示例二

原链表为 10 --> 20 --> 30 --> 40,执行代码:

ListNode node1 = new ListNode(10);
ListNode node2 = new ListNode(20);
ListNode node3 = new ListNode(30);
ListNode node4 = new ListNode(40);

node1.next = node2;
node2.next = node3;
node3.next = node4;

ListNode reverseNode = new Solution().reverseList(node1);

while (reverseNode != null) {
    System.out.print(reverseNode.val + " ");
    reverseNode = reverseNode.next;
}

输出结果为:40 30 20 10

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java实现单向链表反转 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • swift中延迟执行

    Swift中延迟执行的完整攻略 在Swift中,我们可以使用延迟执行来推迟代码的执行,这在某些情况下非常有用。本攻略将详细介绍Swift中延执行的方法和示例。 延迟方法 Swift中有两种方法可以实现延迟执行: 使用DispatchQueue的asyncAfter方法 使用DispatchWorkItem的perform方法 方法一:使用DispatchQu…

    other 2023年5月9日
    00
  • Sublime Text英文字母大小写怎么切换?

    Sublime Text英文字母大小写切换攻略 Sublime Text是一款功能强大的文本编辑器,提供了多种快捷键和功能来方便用户进行编辑操作。下面是关于如何在Sublime Text中切换英文字母大小写的详细攻略。 方法一:使用快捷键 Sublime Text提供了一组快捷键来快速切换英文字母的大小写。以下是常用的快捷键: 转换为大写:按下Ctrl + …

    other 2023年8月16日
    00
  • Android实现蓝牙客户端与服务器端通信示例

    以下是“Android实现蓝牙客户端与服务器端通信示例”的完整攻略: 1. 准备工作 在开始实现蓝牙客户端和服务器端通信之前,我们需要做以下准备工作: 确保安卓设备支持蓝牙功能 在AndroidManifest.xml文件中添加蓝牙权限 <uses-permission android:name="android.permission.BLU…

    other 2023年6月27日
    00
  • python跨文件使用全局变量的实现

    Python跨文件使用全局变量的实现攻略 在Python中,要在多个文件中共享全局变量,可以使用以下方法: 方法一:使用模块 创建一个包含全局变量的模块,例如globals.py。 # globals.py global_var = 10 在其他文件中导入该模块,并使用全局变量。 # main.py import globals print(globals.…

    other 2023年7月28日
    00
  • SpringCloud环境搭建过程之Rest使用小结

    下面详细讲解一下SpringCloud环境搭建过程之Rest使用小结。 什么是Spring Cloud Spring Cloud 是一个基于 Spring Boot 的开发平台,为分布式系统中的一些常见模式、协议、服务提供了一种简单的方法进行构建和管理。它提供了一整套的技术框架,包括服务发现注册、配置中心、客户端负载均衡、断路器、网关路由等等。 Spring…

    other 2023年6月27日
    00
  • nginx+php-fpm配置文件的组织结构介绍

    下面是 “nginx+php-fpm配置文件的组织结构介绍” 的完整攻略: 1. 简介 Nginx和PHP-FPM是流行的Web应用程序服务器和处理器,许多Web应用程序都使用它们作为服务端的基础架构。在配置nginx和php-fpm环境时,正确的配置文件结构是非常重要的,它会影响你网站的性能和稳定性。 本文将介绍nginx和php-fpm的配置文件的组织结…

    other 2023年6月25日
    00
  • Linux配置日志服务器的图文教程

    下面是“Linux配置日志服务器的图文教程”的完整攻略: 准备工作 在开始配置之前,我们需要准备一台安装了Ubuntu Server的服务器。在本教程中,我们使用的是Ubuntu Server 20.04 LTS版本。另外,我们还需要使用SSH工具连接到服务器进行配置。 步骤一:安装syslog-ng syslog-ng是一款高性能的日志收集器,可以将各种日…

    other 2023年6月27日
    00
  • 一起来了解JavaScript的变量作用域

    一起来了解JavaScript的变量作用域 在JavaScript中,变量作用域是指变量在代码中可访问的范围。了解变量作用域对于编写可维护和可扩展的代码非常重要。本攻略将详细介绍JavaScript中的变量作用域。 全局作用域 全局作用域是指在整个JavaScript代码中都可以访问的变量。在全局作用域中声明的变量可以在代码的任何地方使用。 示例1: // …

    other 2023年8月19日
    00
合作推广
合作推广
分享本页
返回顶部