反转链表java实现

反转链表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日

相关文章

  • switch续航版续航如何 switch续航版游玩时间介绍

    当涉及到Switch续航版的游玩时间,有几个因素需要考虑,包括游戏类型、屏幕亮度、网络连接和使用的功能。以下是一个完整的攻略,包含两个示例说明: 1. 游戏类型对续航时间的影响 不同类型的游戏对Switch续航版的电池寿命有不同的影响。例如,图形复杂、要求高性能的游戏(如《塞尔达传说:荒野之息》)会消耗更多的电池电量,而简单的像素游戏(如《超级马里奥奥德赛》…

    other 2023年10月19日
    00
  • 浅谈Pycharm的项目文件名是红色的原因及解决方式

    浅谈Pycharm的项目文件名是红色的原因及解决方式 原因 在Pycharm中,项目文件名变红的原因是因为这些文件在VCS(Git、Svn、Mercurial 等版本控制系统)中被标记为 deleted(已删除的)文件或者是未被加入版本控制中的文件。 如果是deleted文件,说明该文件在VCS中被删除了,但是在本地文件系统中还存在,所以文件名会变成红色。 …

    other 2023年6月26日
    00
  • el autocomplete支持分页上拉加载使用详解

    下面是详细讲解“el autocomplete支持分页上拉加载使用详解”的完整攻略: 什么是el autocomplete? el autocomplete 是 element-ui 组件库提供的可输入下拉选择框组件,可以根据用户输入的数据进行联想提示,提升用户的选择效率。当列表数据量很大的时候,很多时候我们希望能够进行分页和上拉加载,从而提高性能,减少一次…

    other 2023年6月25日
    00
  • 解析C++类内存分布

    解析 C++ 类内存分布,需要了解以下几个概念: 对象的内存分布 成员变量的内存分布 内存对齐原则 对象的内存分布 一个 C++ 对象在内存中的分布包含三个部分: 对象头 成员变量 对象尾(可选) 对象头包含一些元信息,例如虚表指针等内容。成员变量是对象的核心数据,占用了对象内存的大部分空间。对象尾是一些特殊情况下将会占用的空间,例如空类或虚继承。 成员变量…

    other 2023年6月27日
    00
  • bug级别(优先级、严重级)定义

    以下是“bug级别(优先级、严重级)定义的完整攻略”的详细说明,包括过程中的两个示例说明。 bug级别(优先级、严重级)定义完整攻略 在软件开发过程中,bug是不可避免的。为了更好地管理和解决bug,我们需要对bug进行分类和定义。其中,bug级别(优先级、严重级)是一个重要的分类标准。以下是一份关于bug级别(优先级、严重级)定义的完整攻略。 1. bug…

    other 2023年5月10日
    00
  • javascrip关于继承的小例子

    我们来详细讲解一下“JavaScript关于继承的小例子”的完整攻略。 基本概念 在 JavaScript 中,继承是一种重要的功能,它允许我们通过创建一个新对象来扩展已有的对象。通过继承,我们可以避免重复编写相同的代码,提高代码复用性,同时也可以提高程序的灵活性。 JavaScript 中的继承实现方式有很多种,其中最常见的两种方式是原型链继承和类继承。 …

    other 2023年6月27日
    00
  • mysqldumper

    mysqldumper:轻松备份MySQL数据库的利器 什么是mysqldumper mysqldumper是一款针对MySQL数据库的备份工具,它可以帮助网站管理员轻松地备份和还原MySQL数据库。mysqldumper提供了一系列易于使用的功能,使其备份和还原这些重要数据变得非常简单。 mysqldumper的功能特色 备份和还原MySQL数据库:mys…

    其他 2023年3月28日
    00
  • 老生常谈 Java中的继承(必看)

    老生常谈 Java中的继承(必看) 什么是继承 继承是面向对象编程的一种重要特性。它允许一个类(称为子类或派生类)继承另一个类(称为父类或基类)的属性和方法。子类继承父类的属性和方法后,可以在此基础上添加新的属性和方法,也可以重写父类中的方法甚至删除继承的属性和方法。 在Java中,使用 extends 关键字来实现类之间的继承关系。 下面是一个简单的示例,…

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