Java 实现反转一个链表

这篇具有很好参考价值的文章主要介绍了Java 实现反转一个链表。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

思路


翻转指的是改变链表中结点的指向,而不是将它的数据反转。

java链表反转,数据结构与算法,链表,java,数据结构,intellij-idea,编程题
上图展示出的就是一个反转前的链表,下图展示一个反转后的链表。

java链表反转,数据结构与算法,链表,java,数据结构,intellij-idea,编程题
根据上图可以看出,结点的地址和数据都没有改变,改变的只是链表结点的指向,更改后的头结点变成了尾结点。

首先要定义一个 cur 变量,让这个变量指向 head 结点 的下一个结点。
接着就是将 head 结点置为空,也就是将 head 结点地址域保存的地址改为 null 即可。

java链表反转,数据结构与算法,链表,java,数据结构,intellij-idea,编程题
链表中的 head 结点原本保存的是 0x11 这个地址,但是现在改为了 null,表示与后面的结点断开了连接。

cur 这个变量指向的就是 head 结点的下一个结点,由于 head 结点地址域里保存的地址改为 null 就与后面结点断开连接了,此时为了保证 cur 可以成功指向,因此需要先将 cur 移动,然后再改 head 结点的地址域。

接下来要做的就是将 cur 指向的结点和它后面的结点全部移动到 head 结点前面即可。


需要注意的是 如果链表一开始就是空的,直接返回 null即可,因为空的链表无法反转
如果此时的链表只有一个结点,也不需要反转,因为一个结点再怎么反转也没有变化

核心四步骤


核心四步骤分别是 :

1.curNext = cur.next
2.cur.next = head
3.head = cur
4.cur = curNext

先定义的 curNext 始终指向 cur.next,curNext 是为了保证将所有的结点都移动到 head 结点的前面去,实现的一个类似于记录的功能。

java链表反转,数据结构与算法,链表,java,数据结构,intellij-idea,编程题
先将 cur 结点移动到 head 结点的前面,只需要更改 cur 结点地址域中的保存的地址即可,
接着是将 head 指向 cur 指向的结点。

此时第一个结点就已经移动完成了,但是会发现如果还想要移动其他的结点的话其实是无法实现了。
因为此时原本的 head 结点早与后面的结点断开了连接,此时是无法操作后面剩余结点的。

此时四个核心步骤中的 第一个第四个 就体现出了作用。

首先将定义好的 curNext 指向并且始终指向 cur 结点的下一个结点。

java链表反转,数据结构与算法,链表,java,数据结构,intellij-idea,编程题
可以看到此时 curNext 就指向了 cur 结点的下一个结点。

接下来就是更改 cur 结点的指向,将它移动到 head 结点的前面。

java链表反转,数据结构与算法,链表,java,数据结构,intellij-idea,编程题
然后是将 head 指向 cur 指向的位置。

java链表反转,数据结构与算法,链表,java,数据结构,intellij-idea,编程题
此时当我们打算移动其它结点的时候会发现,只需要将 cur 指向 curNext 即可访问到其他的结点了。
这也就是和心步骤的第四步 cur = curNext

java链表反转,数据结构与算法,链表,java,数据结构,intellij-idea,编程题
以上过程是把这四个步骤都走了一遍才会产生的结果,想要把所有的结点都移动到完毕,继续按照顺序执行上面的四个步骤即可。

循环移动


想要将所有的结点全部移动完毕,实现一个循环即可,在这个循环里面去重复执行上述的四个步骤。

java链表反转,数据结构与算法,链表,java,数据结构,intellij-idea,编程题

java链表反转,数据结构与算法,链表,java,数据结构,intellij-idea,编程题
当重复执行了几次循环之后,会发现此时的 cur 虽仍然是指向了 curNext,但是此时 cur 是为空的。
我们此时又可以发现,链表已经反转完成了,因此循环的判定条件就是当 cur 不为空时就继续执行循环,若 cur 为空,也就是说明此时的链表已经反转成功了,跳出循环返回当前的 head 即可。

代码实现

class MySingleNodeTest {
    static class ListNode{
        public int value;//数据
        public ListNode next;//地址

        public ListNode(int value) {
            this.value = value;
        }
    }
    //设置头结点
    public ListNode head;
    //创建链表
    public void createNode() {
        ListNode listNode1 = new ListNode(12);
        ListNode listNode2 = new ListNode(23);
        ListNode listNode3 = new ListNode(34);
        ListNode listNode4 = new ListNode(45);

        listNode1.next = listNode2;
        listNode2.next = listNode3;
        listNode3.next = listNode4;

        this.head = listNode1;//设置头结点
    }
    // 打印链表
    public void disPlay() {
        ListNode cur = this.head;
        while (cur != null) {
            System.out.print(cur.value + " ");
            cur = cur.next;//cur指向它的下一个
        }
        System.out.println();//换行
    }

    // 反转一个链表
    public ListNode reversalList() {
        // 如果链表是空的
        if (this.head == null) {
            return null;
        }
        // 如果只有一个结点不需要反转
        if (this.head.next == null) {
            return this.head;
        }
        // 创建一个 cur 指向头结点的后一个结点
        ListNode cur = this.head.next;
        // 将头结点置为空
        this.head.next = null;
        // 开始四个步骤移动 cur 和后面的结点
        while (cur != null) {
            ListNode curNext = cur.next;
            cur.next = this.head;
            head = cur;
            cur = curNext;
        }
        // 循环结束反转完成返回头结点即可
        return this.head;
    }
}

public class MySingleNode {

    public static void main(String[] args) {
        MySingleNodeTest mySingleNodeTest = new MySingleNodeTest();
        // 调用方法创建链表
        mySingleNodeTest.createNode();
        // 打印反转之前的链表
        mySingleNodeTest.disPlay();

        // 调用反转方法反转
        mySingleNodeTest.reversalList();
        // 打印反转之后的链表
        mySingleNodeTest.disPlay();
    }
}


(1) 反转之前情况:

java链表反转,数据结构与算法,链表,java,数据结构,intellij-idea,编程题
可以看到此时 头结点 中的数据是 12,而末尾结点中的数据是 45。

此时对应的链表图解如下图:

java链表反转,数据结构与算法,链表,java,数据结构,intellij-idea,编程题



(2) 反转之后的情况:

java链表反转,数据结构与算法,链表,java,数据结构,intellij-idea,编程题
调用反转方法后,可以看到此时头结点中的数据变成了 45,而尾结点变成了 12。
此时说明反转成功了。

此时对应的链表图解如下图:

java链表反转,数据结构与算法,链表,java,数据结构,intellij-idea,编程题文章来源地址https://www.toymoban.com/news/detail-669928.html

到了这里,关于Java 实现反转一个链表的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java 数据结构篇-用链表、数组实现队列(数组实现:循环队列)

    🔥博客主页: 【 小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍   文章目录         1.0 队列的说明         1.1 队列的几种常用操作         2.0 使用链表实现队列说明         2.1 链表实现队列         2.2 链表实现队列 - 入栈操作         2.3 链表实现队

    2024年02月05日
    浏览(38)
  • 【数据结构-链表-01】反转链表

    💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学习,不断总结,共同进步,活到老学到老 导航 檀越剑指大厂系列:全面总

    2024年02月10日
    浏览(43)
  • 【数据结构和算法】反转链表

    Java基础合集 数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 其他系列文章导航 文章目录 前言 一、题目描述 二、题解 2.1 方法一:迭代(双指针) 2.2 方法二:递归 三、代码 3.1 方法一:迭代(双指针) 3.2 方法二:递归 四、复杂度分析 4.1 方法一:迭代

    2024年01月18日
    浏览(51)
  • 【数据结构】反转链表、链表的中间节点、链表的回文结构(单链表OJ题)

    正如标题所说,本文会图文详细解析三道单链表OJ题,分别为:  反转链表 (简单)  链表的中间节点 (简单)  链表的回文结构 (较难) 把他们放在一起讲的原因是:  反转链表 和  链表的中间节点 是  链表的回文结构 的基础 为什么这样说?请往下看: 目录 1. 反转链

    2024年02月13日
    浏览(68)
  • 【Java 数据结构】实现一个二叉搜索树

    目录   1、认识二叉搜索树 2、实现一个二叉搜索树 2.1 成员变量 2.2 insert 方法 2.3 search 方法  2.4 remove 方法(重点) 3、二叉搜索树总结 从字面上来看,它只比二叉树多了搜索两个字,我们回想一下,如果要是在二叉树中查找一个元素的话,需要遍历这棵树,效率很慢,而二叉搜

    2024年02月02日
    浏览(40)
  • 数据结构——链表(java)

    1.1 定义 链表是一种物理存储结构上非连续存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的。 如图所示: 1.2 链表分类 单向、双向;带头、不带头;循环、非循环 重点 :单向不带头非循环、双向不带头非循环(集合类底层) 如图:单项带头非循环链表结

    2024年02月09日
    浏览(42)
  • 【数据结构】--单链表力扣面试题②反转链表

    目录 题目链接:反转链表   法一:直接反转法 法二:头插法 题目分析: 创建一个新链表,然后值是逆置的行吗?不行。因为题目要求的是在 原链表上逆置,改变原链表的指向,并不是值的拷贝后的逆转 。 那其实总共有三种方法 。 法一,直接原地翻转。法二,头插法。

    2024年02月06日
    浏览(37)
  • 【数据结构】线性表 ⑤ ( 双循环链表 | 双循环链表特点 | 双循环链表插入操作处理 | 代码示例 - 使用 Java 实现 双循环链表 )

    \\\" 双循环链表 \\\" 是 在 单循环链表 的基础上 , 在每个 节点 中 , 新增一个 指针 , 指向 该节点 的 前驱节点 ; 双向循环链表 每个 节点 都包含 数据 和 两个指针 , 一个指针指向前一个节点 , 一个指针指向后一个节点 ; 与 单循环链表相比 , 双循环链表 可以在两个方向上遍历整个链

    2024年02月13日
    浏览(40)
  • 【数据结构与算法分析】反转链表与顺序表(内含源码,思路清晰)

      顺序表和链表都是数据结构中常见的线性表。它们的主要区别在于 内存管理方式不同 。   顺序表(Array)是由一系列元素按照一定顺序依次排列而成,它使用连续的内存空间存储数据。顺序表使用一个数组来存储数据,数组中的每个元素都可以通过下标来访问。顺序

    2024年02月07日
    浏览(101)
  • 【数据结构】链表OJ面试题(《删除定值、反转、返回中间结点、倒数第k节点、合并链表》)+解析)

    还不清楚链表的码喵们可以看看前篇关于链表的详解 既然已经懂得了链表该如何实现,那么现在就趁热打铁开始练习!这里给码喵们整理了相对不错的一些OJ题来练习  力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 思路:遍历整个表,访问每个表的值并且删除再将nex

    2024年02月22日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包