Как Set работает с Get in Singlely Linked List в JavaScript? - PullRequest
0 голосов
/ 29 апреля 2020

Я новичок ie в JavaScript и пытаюсь выучить структуры данных и алгоритмы.

Я пытаюсь понять, как работает set в зависимости от getIndex.

Вот код:

class Node{
  constructor(val){
    this.val = val;
    this.next = null
  }
}

class SinglyLinkedList{
  constructor(){
    this.head = null;
    this.tail = null;
    this.length = 0;
  }
  push(val){
    let newNode = new Node(val);
    if(!this.head){
      this.head = newNode
      this.tail = this.head
    }else{
      this.tail.next = newNode;
      this.tail = newNode
    }
    this.length++;
    return this;
  }
  getIndex(index){
    if(index > this.length || index < 0) return null;
    let counter = 0, current = this.head;
    while(counter !== index){
      current = current.next;
      counter++;
    }
    return current; // Here we return a value of the node we found
  }
  set(val, index){
    let foundNode = this.getIndex(index);
    if(foundNode){
      foundNode.val = val; 
      // We can change the value of the node we founded in getIndex. Then the set works
      // I don't understand why we can do this. 
      // Since what we do in getIndex is just returning a value of the node. 
      // How does changing that returned node can change the context of the list in term of the purpose of set
      return true;
    }
    return false;

  }
}

let list = new SinglyLinkedList();
list.push(88);
list.push(33);
list.push(11)

list.getIndex(1) // Output: Node: {val: 33, next: 11}. Why does changing this returned node can change the context of the whole list?
list.set(77,1)   // Output: true. List (new) : 88 -> 77 -> 11

По сути, я имею в виду метод getIndex, мы возвращаем узел current. Затем мы изменим его в методе set. Но getIndex просто возвращает значение этого узла? Так почему же мы можем изменить весь список при изменении этого возвращаемого узла с getIndexset)?

Извините за мой глупый вопрос. Не стесняйтесь корректировать мои знания, особенно аспект class. Пожалуйста помоги! Заранее спасибо

1 Ответ

0 голосов
/ 29 апреля 2020

Поскольку вы не возвращаете значение, вы возвращаете ссылку на значение. Вся концепция односвязного списка основана на ссылках.

В качестве эксперимента вместо этого попробуйте вернуть новый узел.

return new Node(current.val)

Он не будет выполнять то же самое. Эта концепция на более глубоком уровне называется pointer.

...