Вернуть стек в обратном порядке

Добрый день! Реализую алгоритм односвязного стека, в котором добавляю элементы и вывожу их на экран (это работает). Решил сделать функцию реверса (только нашел рекурсивно как делается), но не могу её нормально реализовать. Прошу помочь найти ошибку в методе reverse (ловлю NPE, но, мне кажется, я не совсем верно делаю).

public class Main {
    public static void main(String[] args) {
        Stack stack = new Stack();
        stack.push(1);
        stack.printStack();
        stack.push(2);
        stack.printStack();
        stack.push(3);
        stack.printStack();
        stack.pop();
        stack.printStack();
        stack.reverse();
        stack.printStack();
    }
}
public class Stack {
    public static Node head;
    public static Node tail;
    public static Node node;
 
    public static void push(int value) {
        if (head == null) {
            head = new Node(value, null);
        } else {
            node = new Node(value, head);
            head = node;
        }
 
    }
 
    public static int pop() {
        if (head == null) {
            return 0;
        } else {
            int value = head.value;
            head = head.prev;
            return value;
        }
    }
 
    public static void printStack() {
        if (head == null) {
            System.out.println("EMPTY");
        } else {
            node = head;
            while (node != null) {
                System.out.print(node.value);
                if (node.prev != null) {
                    System.out.print(" -> ");
                }
                node = node.prev;
            }
            System.out.println();
        }
    }
 
    public static Stack reverse() {
        if (head == null) {
            return new Stack();
        }
        reversedHead(node);
        Stack reversedStack = new Stack();
        Node newHead = reversedHead(head);
        Node newTail = reversedHead(head);
        reversedStack.head = newHead;
        return reversedStack;
    }
 
    private static Node reversedHead(Node node) {
        Node newNode = new Node(node.value);
        if (node.prev == null) {
            return new Node(newNode, newNode);
        } else {
            head = reversedHead(node.prev);
            tail = reversedHead(node.prev);
            tail.prev = newNode;
            return new Node(head, newNode);
        }
    }
}
public class Node {
    public  int value;
    public  Node prev;
    public  Node valueNode;
 
    public Node(int value, Node prev) {
        this.value = value;
        this.prev = prev;
    }
    public Node(Node valueNode, Node prev) {
        this.valueNode = valueNode;
        this.prev = prev;
    }
 
 
 
    public Node(int value) {
        this.value = value;
    }
}

Может лучше просто в цикле pop из старого и push в новый?)

Может лучше просто в цикле pop из старого и push в новый?)

Подумаю :slightly_smiling_face:
У меня pop для удаления последнего элемента в стэке