反转链表java实现

yizhihongxing

反转链表Java实现

链表是一种常见的数据结构,其特点是可以快速地插入、删除数据。在编程面试中,反转链表常常是经常出现的问题,今天我们来学习如何使用Java实现链表反转。

什么是链表

链表是一种线性结构,其由节点组成,每个节点记录了当前节点的数据和下一个节点的引用。相比于数组,在插入和删除数据时,链表具有更好的性能。

下面是一个简单的链表结构定义:

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

实现方法

反转链表的基本思路是从头节点开始,每次将下一个节点插入到当前节点的前面,直到最后一个节点。这个过程可以用迭代或递归的方式实现。

迭代方法

迭代方法的实现比较简单,我们只需要定义两个指针p和q,初始时p指向头节点,q指向p的下一个节点。然后每次将q指向的节点插入到p的前面即可,直到遍历完整个链表。

下面是Java代码实现:

public ListNode reverseList(ListNode head) {
    if (head == null || head.next == null) {
        return head;
    }
    ListNode p = head;
    ListNode q = head.next;
    while (q != null) {
        ListNode r = q.next;
        q.next = p;
        p = q;
        q = r;
    }
    head.next = null;
    return p;
}

递归方法

递归方法实现方式较为简洁,我们只需要将链表的反转问题转化为前后节点的连接问题。具体实现思路是,先将头节点的下一个节点作为新的头节点,然后将剩余节点的反转问题递归求解。

下面是Java代码实现:

public ListNode reverseList(ListNode head) {
    if (head == null || head.next == null) {
        return head;
    }
    ListNode newHead = reverseList(head.next);
    head.next.next = head;
    head.next = null;
    return newHead;
}

测试方法

为了验证我们实现的反转链表程序是否正确,我们需要对反转前后的链表进行对比。下面是Java代码实现:

public void testReverseList() {
    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 newHead = reverseList(head);

    StringBuilder sb = new StringBuilder();
    while (newHead != null) {
        sb.append(newHead.val).append(" -> ");
        newHead = newHead.next;
    }
    String result = sb.toString().substring(0, sb.length() - 4);
    Assert.assertEquals("5 -> 4 -> 3 -> 2 -> 1", result);
}

总结

本篇文章介绍了如何使用Java实现链表的反转,包括迭代和递归两种方法。链表反转是一个常见的编程面试题,在学会了具体的实现方法后,希望能够帮助读者更好地应对面试中的问题。

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

(0)
上一篇 2023年3月28日
下一篇 2023年3月28日

相关文章

  • Java 客户端向服务端上传mp3文件数据的实例代码

    我将为您详细讲解“Java 客户端向服务端上传 mp3 文件数据的实例代码”的完整攻略。 确定上传接口 首先需要确认服务端的上传接口,即确定上传 mp3 文件所需的请求地址和参数信息。 编写客户端代码 创建一个 Java 项目,导入 Apache HttpClient 工具包。 读取本地 mp3 文件,将文件转换为字节数组。 String filePath …

    other 2023年6月25日
    00
  • C语言实现反弹球游戏

    C语言实现反弹球游戏 前言 反弹球游戏是经典的街机游戏之一,本文将详细讲解如何使用C语言实现反弹球游戏。反弹球游戏的基本原理是球与挡板之间的物理反弹,因此本文将学习如何使用C语言实现基础的物理计算。 环境搭建 在实现反弹球游戏之前,需要搭建开发环境。本文使用的是Visual Studio Code和MinGW编译器。 具体步骤如下: 在Windows上安装V…

    other 2023年6月26日
    00
  • Effective Java 在工作中的应用总结

    Effective Java 在工作中的应用总结 简介 Effective Java 是由 Java 技术专家 Joshua Bloch 所著的一本 Java 开发书籍,它强调了使用 Java 编程时最佳实践和设计模式,能够帮助开发者编写出更加健壮,可维护,可读性等等更好的和更可靠的代码。 Effective Java 的内容非常丰富,其中包括编程风格、创建…

    other 2023年6月27日
    00
  • 通过python顺序修改文件名字的方法

    以下是通过python顺序修改文件名字的方法的完整攻略: 步骤一:导入os和re模块 在使用Python修改文件名之前,首先需要导入两个模块,即os和re。 import os import re os模块:提供了访问文件系统的功能,包括对文件和目录的创建、删除、重命名、修改权限等操作。 re模块:是Python中处理正则表达式的模块,我们可以用它来匹配文件…

    other 2023年6月26日
    00
  • poi解析excel内容

    以下是关于“POI解析Excel内容”的完整攻略: 步骤1:准备数据 首先,需要准备要解析的Excel文件。可以使用Java的POI库来读取和解析文件。在本攻略中,我们将使用一个名为example.xlsx的Excel文件作为示例。 步骤2:使用POI库解析Excel内容 接下来,需要使用POI库来解析Excel内容。可以使用Workbook、Sheet和R…

    other 2023年5月7日
    00
  • pythonitchat模块的使用 利用图灵机器人进行微信消息自动…

    Python itchat模块的使用:利用图灵机器人进行微信消息自动回复 介绍 itchat是一个开源的微信个人号接口,使用python调用微信从未如此简单。 本篇文章将会介绍如何使用itchat模块和图灵机器人API进行微信消息的自动回复。 准备工作 首先,我们需要安装itchat模块和requests模块。 安装itchat模块:pip install …

    其他 2023年3月28日
    00
  • 关于c#:无法添加对.dll的引用。请确保该文件可访问 并且…

    关于C#:无法添加对.dll的引用攻略 在C#中,我们可以使用引用来使用其他程序集中的类和方法。有时,我们可能会遇到无法添加对.dll的引用的问题。本攻略将介绍这个问题的原因,并提供两个示例。 原因 无法添加对.dll的引用的原因可能有多。以下是一些常见的原因: 文件不可访问:.dll文件可能被其他进程锁定,或者我们没有足够的权限来访问文件。 文件已损坏:.…

    other 2023年5月9日
    00
  • Java多线程揭秘之synchronized工作原理

    Java多线程揭秘之synchronized工作原理 Java多线程编程中,synchronized关键字是最基础和最常用的并发控制手段之一,也是Java内置的重量级锁实现。本文将详细讲解synchronized关键字的工作原理,以及如何正确使用synchronized。 synchronized基本概念 synchronized是Java中的一个关键字,它…

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