Java中反转单链表2种方法

反向单链表一直以来是Java面试问题之一。在 Java 中逆转单链表涉及迭代列表并改变节点间链接的方向。

方法1:下面是一个使用迭代方法的简单实现:

class ListNode {
    int val;
    ListNode next;

    ListNode(int val) {
        this.val = val;
    }
}

public class ReverseLinkedList {
    public static ListNode reverseList(ListNode head) {
        ListNode prev = null;
        ListNode current = head;
        ListNode next = null;

        while (current != null) {
            next = current.next; // Save the next node
            current.next = prev;
// Reverse the link
            prev = current;      
// Move to the next nodes
            current = next;
        }

       
// prev "现在指向反转列表的新首部
        return prev;
    }

   
// Helper method to print the linked list
    public static void printList(ListNode head) {
        ListNode current = head;
        while (current != null) {
            System.out.print(current.val +
" ");
            current = current.next;
        }
        System.out.println();
    }

    public static void main(String[] args) {
       
// Example usage
        ListNode head = new ListNode(1);
        head.next = new ListNode(2);
        head.next.next = new ListNode(3);
        head.next.next.next = new ListNode(4);
        head.next.next.next.next = new ListNode(5);

        System.out.println(
"Original Linked List:");
        printList(head);

       
// 反转链接列表
        head = reverseList(head);

        System.out.println(
"Reversed Linked List:");
        printList(head);
    }
}

在本例中,reverseList 方法将链表的首部作为输入,迭代地反转节点之间的链接方向。printList 方法是一个辅助函数,用于打印链表中的元素以供验证。

方法2:使用compareTo()方法:

public class Node<T> implements Comparable<T> {
    private T NodeValue;
    private Node<T> nodeNextReference;
    public T getValue() {
        return NodeValue;
    }
    public void setValue(T nodeValue) {
        this.NodeValue = nodeValue;
    }
    public Node<T> GetNextReference() {
        return nodeNextReference;
    }
    public void SetNextRef(Node<T> nodeNextReference) {
        this.nodeNextReference = nodeNextReference;
    }
    // @Override indicates that a method declaration is intended to override a method declaration in a supertype.
    @Override
    public int compareTo(T nodeValue) {
        if (nodeValue == this.NodeValue) {
            return 0;
        } else {
            return 1;
        }
    }
}

主程序:

public class ReverseLinkedList<T> {
    private Node<T> headElement;
    // 遍历 Node 中的元素
    public void IterateElement() {
        Node<T> tempVariable = headElement;
        while (true) {
            if (tempVariable == null) {
                break;
            }
            print(tempVariable.getValue() +
"  ");
            tempVariable = tempVariable.GetNextReference();
        }
    }
   
// Reverse elements in Node
    public void ReverseElement() {
        println(
"\nReversing Linked List now...\n");
        Node<T> previousElement = null;
        Node<T> currentElement = headElement;
        Node<T> nextElement = null;
        while (currentElement != null) {
            nextElement = currentElement.GetNextReference();
            currentElement.SetNextRef(previousElement);
            previousElement = currentElement;
            currentElement = nextElement;
        }
        headElement = previousElement;
    }
   
// 为节点添加元素
    public void AddElement(T element) {
        Node<T> Node = new Node<T>();
        Node.setValue(element);
        println(
"Adding Element: " + element);
        Node<T> tempVariable = headElement;
        while (true) {
            if (tempVariable == null) {
                headElement = Node;
// 只有一个元素?头部和尾部指向相同
                break;
            } else if (tempVariable.GetNextReference() == null) {
                tempVariable.SetNextRef(Node);
                break;
            } else {
                tempVariable = tempVariable.GetNextReference();
            }
        }
    }
   
// 主要测试方法
    public static void main(String a[]) {
        ReverseLinkedList<Integer> LinkedList = new ReverseLinkedList<Integer>();
        int RandomNo;
        println(
"in main()...\n");
       
// 让我们创建一个包含 15 个值的整数数组
        for (int i = 1; i <= 8; i++) {
            RandomNo = (21 + (int) (Math.random() * ((55 - 2))));
// We are just getting total 8 Random elements
            LinkedList.AddElement(RandomNo);
        }
        println(
"\nOriginal Linked List:");
        LinkedList.IterateElement();
        println(
"");
        LinkedList.ReverseElement();
        println(
"Reversed Linked List:");
        LinkedList.IterateElement();
    }
   
// 带有新行的简单日志工具
    private static void println(String string) {
        System.out.println(string);
    }
   
// Simple Log utility
    private static void print(String string) {
        System.out.print(string);
    }
}