📜  在Java中反转 LinkedList(1)

📅  最后修改于: 2023-12-03 15:23:24.252000             🧑  作者: Mango

在Java中反转 LinkedList

什么是 LinkedList?

LinkedList是Java中的一种线性数据结构,它是由一个个节点组成,每个节点存储了元素以及指向下一个节点的引用。它有如下特点:

  • 能够高效地进行插入和删除操作,时间复杂度为O(1)
  • 查找操作的时间复杂度为O(n)
  • LinkedList中的数据是按照插入的顺序进行存储的,而不是按照关键字排序的
如何反转 LinkedList?

反转LinkedList有多种方法,下面列出三种常见的方法:

方法一:使用Collections类的reverse方法

Collections类中提供了一个用于反转List的方法reverse,可以用于反转LinkedList。

import java.util.Collections;
import java.util.LinkedList;

public class ReverseLinkedList{
    public static void main(String[] args) {
        LinkedList<String> list = new LinkedList<>();
        list.add("apple");
        list.add("banana");
        list.add("orange");

        System.out.println("Before Reverse: " + list);
        Collections.reverse(list);
        System.out.println("After Reverse: " + list);
    }
}

输出结果:

Before Reverse: [apple, banana, orange]
After Reverse: [orange, banana, apple]
方法二:使用Stack类

我们可以使用Stack类来反转LinkedList,将每个元素压入栈中,再依次弹出即可。

import java.util.LinkedList;
import java.util.Stack;

public class ReverseLinkedList{
    public static void main(String[] args) {
        LinkedList<String> linkedList = new LinkedList<>();
        linkedList.add("apple");
        linkedList.add("banana");
        linkedList.add("orange");

        System.out.println("Before Reverse: " + linkedList);

        Stack<String> stack = new Stack<>();
        while (!linkedList.isEmpty()) {
            stack.push(linkedList.pop());
        }
        while (!stack.isEmpty()) {
            linkedList.add(stack.pop());
        }

        System.out.println("After Reverse: " + linkedList);
    }
}

输出结果:

Before Reverse: [apple, banana, orange]
After Reverse: [orange, banana, apple]
方法三:使用递归

使用递归的方法也能反转LinkedList。我们可以定义一个递归函数,将链表的第一个节点作为参数传入,然后递归地将其余的节点反转,最后将第一个节点作为最后一个节点返回。

import java.util.LinkedList;

public class ReverseLinkedList {

    Node head;

    static class Node {
        String data;
        Node next;

        Node(String d) {
            data = d;
            next = null;
        }
    }

    public Node reverse(Node node) {
        if (node == null || node.next == null) {
            return node;
        }
        Node remaining = reverse(node.next);
        node.next.next = node;
        node.next = null;
        return remaining;
    }

    public void printList(Node node) {
        while (node != null) {
            System.out.print(node.data + " ");
            node = node.next;
        }
        System.out.println();
    }

    public static void main(String[] args) {
        ReverseLinkedList list = new ReverseLinkedList();
        list.head = new Node("apple");
        list.head.next = new Node("banana");
        list.head.next.next = new Node("orange");

        System.out.println("Before reverse: ");
        list.printList(list.head);

        list.head = list.reverse(list.head);

        System.out.println("After reverse: ");
        list.printList(list.head);
    }
}

输出结果:

Before reverse:
apple banana orange 
After reverse:
orange banana apple 
总结

反转LinkedList有多种方法,我们可以使用Collections类的reverse方法、Stack类、递归等方法。需要根据实际应用场景选择最合适的方法。