Добрый день! Реализую алгоритм односвязного стека, в котором добавляю элементы и вывожу их на экран (это работает). Решил сделать функцию реверса (только нашел рекурсивно как делается), но не могу её нормально реализовать. Прошу помочь найти ошибку в методе 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;
}
}