设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间09 现在时间09 缓存数据 我们所有的努力所有的奋斗,都是为了拥有一个美好的未来。和遇见更好的自己。请把努力当成一种习惯,而不是三分钟热度。每一个你羡慕的收获,都是努力用心拼来的。早安!

我们所有的努力所有的奋斗,都是为了拥有一个美好的未来。和遇见更好的自己。请把努力当成一种习惯,而不是三分钟热度。每一个你羡慕的收获,都是努力用心拼来的。早安!

查看: 836|回复: 0

java反转链表的多种解决方法举例详解

[复制链接]

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
39
主题
31
精华
0
金钱
111
积分
70
注册时间
2023-10-4
最后登录
2025-5-31

发表于 2025-5-31 05:58:45 | 显示全部楼层 |阅读模式

反转链表的三种方式

1.png

1,使用栈解决

栈是最容易的一种方式了,因为栈是先进后出。实现原理就是把链表节点一个个入栈,全部入栈之后再一个个出栈,出栈的时候在把节点按照出栈的顺序组成一个新的链表。

原理如图:

2.jpeg

代码如下:

  1. public ListNode ReverseList(ListNode head){
  2. Stack<ListNode> stack = new Stack<>();
  3. //把全部节点都压入栈中
  4. while(head != null){
  5. stack.push(head);
  6. head = head.next;
  7. }
  8. //如果stack栈里面没有数据,说明head是一个空指针,因此可以直接返回
  9. //不需要进行后续计算
  10. if(stack.isEmpty()){
  11. return null;
  12. }
  13. ListNode node = stack.pop();//出栈的第一个节点成为第一个新链表的第一个节点
  14. ListNode dummy = node; //保留头节点,用于最后的返回
  15. //把栈中的节点全部出栈,然后重新连成一个新的链表
  16. while(!stack.isEmpty()){
  17. node.next = stack.pop();
  18. node = node.next;//更换链表的最后一个元素
  19. }
  20. //最后一个节点就是反转前的头节点,需要让他的next为null
  21. //不然可能构成环
  22. node.next = null;
  23. return dummy;//最后返回保存好的头节点
  24. }
复制代码

2,双指针实现

利用两个指针来保存链表中数据,一个指针用来存储当前节点中next元素中更改后的值,另一个指针来指向下一个需要更改节点的地址。

原理如图:

3.jpeg

代码如下:

  1. public ListNode ReverseList(ListNode head) {
  2. //当前节点中next元素改变后的值
  3. //初始值为null是因为更改后 原第一个元素 改后最后一个元素
  4. //next指向的值为null
  5. ListNode ChangeNode = null;
  6. while (head != null) {
  7. //先保存当前访问的节点的下一个节点
  8. //留着while循环最后更新数据并且
  9. ListNode nextNode = head.next;
  10. //把当前节点中next元素进行更改,使其可以指向前一个元素
  11. head.next = ChangeNode;
  12. //更新ChangeNode指针,用于下一次节点next元素更新
  13. ChangeNode = head;
  14. //更新节点,去往下一个节点
  15. head = nextNode;
  16. }
  17. //循环之后ChangeNode指向的值为 原最后一个节点 改后第一个节点
  18. //所以返回ChangeNode就是改后的头节点
  19. return ChangeNode;
  20. }
复制代码

3,递归实现        

递归实现是最难的,理由是递归本身很难理解。我认为递归的本质是通过不断的改变参数找到问题的原点,再进行返回。逻辑处理部分则是在不断找寻原点的过程中,或者是找到原点后在返回的过程中进行的。这个题目既可以在找原点的过程中设置逻辑处理,也可以在返还的过程中进行逻辑处理。 

找原点的过程中设置逻辑处理:

  1. public ListNode ReverseList(ListNode head) {
  2. //Reverse函数的两个参数的意思是,当前节点和上一个节点
  3. //head是原本函数的头节,null是更改后头节点指向的值
  4. return Reverse(head, null);
  5. }
  6. public ListNode Reverse(ListNode nowNode, ListNode lastNode) {、
  7. //当前节点是null
  8. //说明上一个节点是最后一个节点
  9. if (nowNode == null) {
  10. return lastNode;
  11. }
  12. //先保存下一个地址的位置
  13. ListNode next = nowNode.next;
  14. //让当前节点指向上一个节点
  15. nowNode.next = lastNode;
  16. //处理完这个节点的逻辑之后开始前往下一个节点
  17. return Reverse(next, nowNode);
  18. }
复制代码

返还的过程中进行逻辑处理:

  1. public ListNode ReverseList(ListNode head){
  2. //当前节点的next元素没有指向下一个元素的时候说明这是最后一个元素
  3. if(head == null || head.next == null){
  4. return head;
  5. }
  6. //找到最后一个元素,并开始一层一层的往上传递
  7. ListNode last = ReverseList(head.next);
  8. //把下一个元素指向的元素改为自己
  9. //(因为递归条件的影响当前的元素只可能是反转后第二个元素之后的元素,
  10. // 所以head.next.next不会越界)
  11. head.next.next = head;
  12. //并且清除当前指向的节点,防止可能的问题(成环)
  13. head.next = null;
  14. //传递最后一个元素
  15. return last;
  16. }
复制代码

建议先看懂前面两个方法再来看最后的递归,先看懂这个题目的基本处理逻辑。

后面两个解法的本质是指针的运用,Java对这方面没有很好的解释,所以可能会有点难理解

总结

到此这篇关于java反转链表的多种解决方法的文章就介绍到这了,更多相关java反转链表解决方法内容请搜索晓枫资讯以前的文章或继续浏览下面的相关文章希望大家以后多多支持晓枫资讯!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表