java实现链表反转

 更新时间:2021年08月17日 11:36:40   作者:奋斗的二哈  
这篇文章主要为大家详细介绍了java实现链表反转,分别通过迭代法、递归法实现java链表反转,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文为大家分享了java实现链表反转的具体代码,供大家参考,具体内容如下

算法题:实现链表的反转

提供了2种方法,迭代法、递归法。

(为了方便输出可视化,在自定义的ListNode中重写了toString方法。)

/**
 * Created By --- on 2021/8/12
 * 以下代码可以直接粘贴进编译器输出
 */
public class ReverseList {
 
  public static void main(String[] args) {
    ListNode head = new ListNode(3, new ListNode(5, new ListNode(8, new ListNode(9))));
    System.out.println("初始链表:" + head);
 
    ListNode newList = reverseList(head);
    System.out.println("使用迭代法反转链表:" + newList);
 
    ListNode newList2 = reverseList2(null, newList);
    System.out.println("使用递归法反转链表:" + newList2);
  }
 
  /**
   * 迭代法
   */
  public static ListNode reverseList(ListNode head) {
    ListNode pre = null;
    ListNode cur = head;
    ListNode tmp;
    while (cur != null) {
      tmp = cur.next;
      cur.next = pre;
      pre = cur;
      cur = tmp;
    }
    return pre;
  }
 
  /**
   * 递归法
   */
  public static ListNode reverseList2(ListNode pre, ListNode cur) {
    if (cur == null) {
      return pre;
    }
 
    ListNode tmp = cur.next;
    cur.next = pre;
    pre = cur;
    cur = tmp;
    return reverseList2(pre, cur);
  }
 
 
}
 
 
/**
 * singly-linked list
 */
class ListNode {
 
  int val;
  ListNode next;
 
  ListNode() {
  }
 
  ListNode(int val) {
    this.val = val;
  }
 
  ListNode(int val, ListNode next) {
    this.val = val;
    this.next = next;
  }
 
  @Override
  public String toString() {
    StringBuilder sb = new StringBuilder(String.valueOf(val));
    ListNode next = this.next;
    while (next != null) {
      sb.append(next.val);
      next = next.next;
    }
    return sb.toString();
  }
}

输出结果:

再为大家分享一段java实现链表反转的三种方式

分别通过栈、递归、指针的方式实现:

import java.util.Stack;
 
public class ReverseLinkedList {
 
    public static void main(String[] args) {
        ReverseLinkedList reverseLinkedList = new ReverseLinkedList();
        reverseLinkedList.test();
    }
 
    public void test() {
        Node node1 = new Node(1);
        Node node2 = new Node(2);
        Node node3 = new Node(3);
        node1.setNext(node2);
        node2.setNext(node3);
        //方法需要替换
        node1 = reverseByPointer(node1);
        while (node1 != null) {
            System.out.println(node1.val);
            node1 = node1.getNext();
        }
    }
 
    //栈实现
    private Node reverseByStack(Node head) {
        if (head == null || head.getNext() == null) {
            return head;
        }
        Stack<Node> stack = new Stack<>();
        while (head != null) {
            stack.push(head);
            head = head.getNext();
        }
        head = stack.pop();
        Node tmp = head;
        while (!stack.empty()) {
            Node node = stack.pop();
            node.setNext(null);
            tmp.setNext(node);
            tmp = node;
        }
        return head;
    }
 
    //递归实现
    private Node reverseByRecursion(Node head) {
        if (head == null || head.getNext() == null) {
            return head;
        }
        //递归获取当前节点的后一个节点
        Node tmp = reverseByRecursion(head.getNext());
        Node node = head.getNext();
        head.setNext(null);
        node.setNext(head);
        return tmp;
    }
 
    //指针实现
    private Node reverseByPointer(Node head) {
        if (head == null || head.getNext() == null) {
            return head;
        }
        //pre指针指向前一个节点,初始第一个节点的前节点为空
        Node pre = null;
        //tmp指针指向当前节点
        Node tmp = null;
        while (head != null) {
            //tmp指针指向head头指针节点
            tmp = head;
            //head头指针向后遍历
            head = head.getNext();
            //反转,设置当前节点的下一个节点为前一个节点
            tmp.setNext(pre);
            //pre指针向后移动,指向当前节点
            pre = tmp;
        }
        return tmp;
    }
 
    private class Node {
        private int val;
 
        private Node next;
 
        public Node(int val) {
            this.val = val;
        }
 
        public Node getNext() {
            return next;
        }
 
        public void setNext(Node next) {
            this.next = next;
        }
    }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Mybatis中updateBatch实现批量更新

    Mybatis中updateBatch实现批量更新

    本文主要介绍了Mybatis中updateBatch实现批量更新,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • Java过滤器Filter详解

    Java过滤器Filter详解

    这篇文章主要介绍了java过滤器中Filter,发送请求时,如果有不符合的信息将会被filter进行拦截,如果符合则会进行放行。如果感兴趣可以来学习一下
    2021-08-08
  • 如何查看JVM使用的默认的垃圾收集器

    如何查看JVM使用的默认的垃圾收集器

    这篇文章主要介绍了如何查看JVM使用的默认的垃圾收集器,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • Java并发应用之任务执行分析

    Java并发应用之任务执行分析

    这篇文章主要为大家详细介绍了JavaJava并发应用编程中任务执行分析的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2023-07-07
  • SpringBoot@DeleteMapping(/xxx/{id})请求报405的解决

    SpringBoot@DeleteMapping(/xxx/{id})请求报405的解决

    这篇文章主要介绍了SpringBoot@DeleteMapping(/xxx/{id})请求报405的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • Java操作Elasticsearch rest-high-level-client 的基本使用

    Java操作Elasticsearch rest-high-level-client 的基本使用

    这篇文章主要介绍了Java操作Elasticsearch rest-high-level-client 的基本使用,本篇主要讲解一下 rest-high-level-client 去操作 Elasticsearch的方法,结合实例代码给大家详细讲解,需要的朋友可以参考下
    2022-10-10
  • Java中Vector与ArrayList的区别详解

    Java中Vector与ArrayList的区别详解

    本篇文章是对Java中Vector与ArrayList的区别进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • 理解Java的序列化与反序列化

    理解Java的序列化与反序列化

    这篇文章主要为大家详细介绍了Java的序列化与反序列化,序列化是一种对象持久化的手段。普遍应用在网络传输、RMI等场景中。本文通过分析ArrayList的序列化来介绍Java序列化的相关内容,感兴趣的小伙伴们可以参考一下
    2016-02-02
  • Java实现简易提款机

    Java实现简易提款机

    这篇文章主要为大家详细介绍了Java实现简易提款机,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • 为何修改equals方法时还要重写hashcode方法的原因分析

    为何修改equals方法时还要重写hashcode方法的原因分析

    这篇文章主要介绍了为何修改equals方法时还要重写hashcode方法的原因分析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06

最新评论