1) Сохранить ссылку на текущий (изначально заголовок), следующий (изначально нулевой), предыдущий (изначально нулевой) узел
2) Установить хвост на заголовок, если вы используете указатель хвоста
[ 115] 3) Перейдите этот параметр списка рядом с current.next, current.next к предыдущему, предыдущему к текущему и, наконец, текущему к следующему
4) В зависимости от того, как вы это делаете после цикла, вы должны установить current.next to previous и head to current
Я включил итерационные и рекурсивные решения ниже.
class Node {
constructor(value, next){
this.value = value;
this.next = next;
}
}
class LinkedList {
constructor(){
this.size = 0;
this.head = null;
this.tail = null;
}
add(value){
const node = new Node(value, null);
if(this.head === null){
this.head = node;
this.tail = node;
} else {
this.tail.next = node;
this.tail = node;
}
this.size++;
}
traverse(){
let current = this.head;
while(current != null){
console.log(current.value);
current = current.next;
}
}
reverse(){
let current = this.head;
let previous = null;
let next = null;
this.tail = current;
while(current != null && current.next != null){
next = current.next;
current.next = previous;
previous = current;
current = next;
}
current.next = previous;
this.head = current;
}
_reverseRecursively(node){
if(node == null){
return null;
}
if(node.next == null){
this.head = node;
return node;
}
let nextNode = this._reverseRecursively(node.next);
nextNode.next = node;
node.next = null;
return node;
}
reverseRecursively(){
this.tail = this.head;
this._reverseRecursively(this.head);
}
}
const list = new LinkedList();
list.add(10);
list.add(12);
list.add(14);
console.log("Original List");
list.traverse();
list.reverse();
console.log("Reversed List - using loop");
list.traverse();
list.reverseRecursively();
console.log("Reversed List - using recursion");
list.traverse();
Я собираюсь сделать безумное предположение, что вы используете MySQL :-) Он использует «нулевые даты» в качестве специального заполнителя - к сожалению, JDBC не может обрабатывать их по умолчанию.
Решение состоит в том, чтобы указать "zeroDateTimeBehavior = convertToNull" в качестве параметра для вашего соединения MySQL (либо в URL-адресе источника данных, либо в качестве дополнительного свойства), например:
jdbc:mysql://localhost/myDatabase?zeroDateTimeBehavior=convertToNull
Это приведет к получению всех таких значений как NULL.
Я не понимаю смысла в вашем коде, где вы форматируете, а затем снова анализируете дату. Это похоже на идентичную операцию. Может быть, вы могли бы уточнить?
Если вы хотите присвоить дате значение по умолчанию, вы можете сделать:
/** Jan 1, 1970 ; first moment in time in Java */
private static final Date NO_DATE = new Date(0L);
private Date date;
public void setDate(final Date date) {
if (date == null) {
this.date = NO_DATE;
} else {
this.date = date;
}
}
Примечание: аннотации являются опциональными, здесь я не сделал добавить их.
В этом коде вы можете заменить то, что вы хотите, условием и значением по умолчанию.
Вы также можете добавить аналогичный установщик, который будет принимать аргумент String, и проверить ваше специальное значение «00000 ...». Это позволило бы установить поле либо с датой, либо со строкой.