Изменение списка ссылок в JavaScript перезаписывает это.head и не обновляется

#javascript #data-structures

#javascript #структуры данных

Вопрос:

Не уверен, что здесь происходит не так в функции reverseLinkedList .

Я пытаюсь изменить список ссылок, и шаги, которые я предпринял, похоже, работают у онлайн-судей, таких как leetcode / hackerrank. Конечно, структура по умолчанию отличается при создании списка ссылок.

 class Node{
  ...
}


class LinkedList{
  constructor(){
    this.head = null;
    this.size = 0;
  };
    
  insert(data){
    this.head = new Node(data, this.head);
    this.size  ;
  };

  printElements(){
    let current = this.head;
    while(current){
      console.log(current.data)
      current = current.next;
    }
  };

  reverseLinkedList(){
    let prev = null;
    let current = this.head;
    let temp;
    while(current){
        temp = current.next;
        current.next = prev;
        prev = current;
        current = temp;
    }
  }
}

const ll = new LinkedList();

ll.insert(1);
ll.insert(12);
ll.insert(6);

ll.reverseLinkedList();

ll.printElements();

 

Попробовал решить ту же проблему с помощью leetcode / hackerrank, и это работает нормально. Кстати, я не совсем понимаю, почему это происходит.

Ответ №1:

Вам не хватает, чтобы установить новый .head на прежний последний узел:

 reverseLinkedList() {
  let prev = null;
  let current = this.head;
  while (current) {
    const temp = current.next;
    current.next = prev;
    prev = current;
    current = temp;
  }
  this.head = prev;
//^^^^^^^^^^^^^^^^^
}
 

Ответ №2:

В конце ваш заголовок должен указывать на предыдущий, поэтому, когда вы повторяете связанный список, он начинает формировать предыдущий (как новый заголовок), добавьте приведенный ниже код, когда цикл закончится.

 this.head = prev;