当前位置:   article > 正文

反转链表的Java实现_反转链表java实现

反转链表java实现

目录

1、迭代法

2、递归方式


反转链表

  1. 输入:1->2->3->4->5
  2. 输出:5->4->3->2->1

1、迭代法

思路:遍历整个链表,当链表不为空时,每次取链表的第一个Node作为当前节点,修改当前Node的指针,重复此步骤,步骤解析如下:

Java代码的具体实现步骤

  1. public static ListNode reverseNode_1(ListNode node) {
  2. ListNode previous = null, current, next;
  3. current = node;
  4. // 如果当前node不为空,遍历链表
  5. while (current != null) {
  6. // 保存当前节点的链接
  7. next = current.next;
  8. // 修改当前节点的链接,更改为指向之前的节点
  9. current.next = previous;
  10. // 修改之前的节点的值为当前节点
  11. previous = current;
  12. // 修改当前节点的值,继续向下遍历
  13. current = next;
  14. }
  15. return previous;
  16. }

2、递归方式

思路:使用递归,需要满足递归需要的条件

(1)终止递归的条件:当Node为空,或者Node.next为空(只有一个节点),则递归终止,返回当前Node

(2)终止递归的处理方法:return 当前 Node

(3)重复逻辑:修改当前节点下一个节点的指针->指向当前节点;当前节点的指针指向Null

所以,递归的流程入下:重复把当前节点下一个节点的指针->指向当前节点;然后把当前节点的指针指向Null(破环)

Java代码的实现如下:

  1. public static ListNode reverseNode_2(ListNode node) {
  2. // 终止条件和终止方法
  3. if (node == null || node.next == null) {
  4. return node;
  5. }
  6. // 把node替换为node.next继续向下寻找
  7. ListNode new_node = reverseNode_2(node.next);
  8. // 反转指针:每一个节点都执行此操作
  9. node.next.next = node;
  10. // 不用担心断开,因为后续步骤都会为node.next赋值,当前步骤保持为null就好
  11. node.next = null;
  12. return new_node;
  13. }

下边,对于递归具体的步骤,给出详细的步骤说明:

首先,当递归到节点(5)时,因为(5)的下一个节点是Null,所以 5->Null 会直接返回,当递归到节点(4)时,此时当前节点为 4->5->Null ,在此节点指针修改之前,new_node 仍旧为 5->Null (前一次递归返回)。

然后,开始修改指针,依次执行下边代码

  1. // 修改(4)的下一个节点(5)的next指针由Null指向(4)
  2. node.next.next = node;
  3. // 修改(4)节点的next指针由(5)指向Null
  4. node.next = null;

修改后,节点(4)变成了 4->Null,new_node 节点变成 5->4->Null,并且把 new_node 返回,图示如下:

重复以上步骤,直到结束递归。

完整的Java代码如下

  1. /**
  2. * @author swadian
  3. * @date 2022/5/8
  4. * @Version 1.0
  5. * @describetion 反转链表
  6. */
  7. public class ReverseListNode {
  8. // 链表
  9. static class ListNode {
  10. int val; // value
  11. ListNode next; // 指针
  12. public ListNode(int val, ListNode next) {
  13. this.val = val;
  14. this.next = next;
  15. }
  16. @Override
  17. public String toString() {
  18. return "(" + val + "-> " + next + ')';
  19. }
  20. }
  21. /**
  22. * 输入:1-2-3-4-5
  23. * 输出:5-4-3-2-1
  24. */
  25. public static void main(String[] args) {
  26. ListNode listNode = prepareListNode();
  27. ListNode node1 = reverseNode_1(listNode);
  28. ListNode node2 = reverseNode_2(listNode);
  29. }
  30. /**
  31. * 迭代思想
  32. * 输入:1-2-3-4-5 : (1,->2),(2,->3),(3,->4),(4,->5),(5,->null)
  33. * 输出:5-4-3-2-1 : (5,->4),(4,->3),(3,->2),(2,->1),(1,->null)
  34. */
  35. public static ListNode reverseNode_1(ListNode node) {
  36. ListNode previous = null, current, next;
  37. current = node;
  38. // 如果当前node不为空,遍历链表
  39. while (current != null) {
  40. // 保存当前节点的链接
  41. next = current.next;
  42. // 修改当前节点的链接,更改为指向之前的节点
  43. current.next = previous;
  44. // 修改之前的节点的值为当前节点
  45. previous = current;
  46. // 修改当前节点的值,继续向下遍历
  47. current = next;
  48. }
  49. return previous;
  50. }
  51. // 递归
  52. public static ListNode reverseNode_2(ListNode node) {
  53. // 终止条件和终止方法
  54. System.out.println(node);
  55. if (node == null || node.next == null) {
  56. return node;
  57. }
  58. // 把node替换为node.next继续向下寻找
  59. ListNode new_node = reverseNode_2(node.next);
  60. // 反转指针:每一个节点都执行此操作
  61. node.next.next = node;
  62. // 不用担心断开,因为后续步骤都会为node.next赋值,当前步骤保持为null就好
  63. node.next = null;
  64. return new_node;
  65. }
  66. public static ListNode prepareListNode() {
  67. ListNode node5 = new ListNode(5, null);
  68. ListNode node4 = new ListNode(4, node5);
  69. ListNode node3 = new ListNode(3, node4);
  70. ListNode node2 = new ListNode(2, node3);
  71. ListNode node1 = new ListNode(1, node2);
  72. return node1;
  73. }
  74. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/209932
推荐阅读
相关标签
  

闽ICP备14008679号