>source

연결된 목록의 마지막 요소를 제거해야하는이 코드를 우연히 발견했습니다. 지역 변수를 수정하여 클래스 속성을 수정하는 방법을 이해하지 못합니다.

class LinkedList {
  constructor() {
    this.head = null;
  }
  removeLast() {
    if (!this.head) {
      return;
    }
    if (!this.head.next) {
      this.head = null;
      return;
    }
    let previous = this.head;
    let node = this.head.next;
    while (node.next) {
      previous = node;
      node = node.next;
    }
    previous.next = null;
  }
}

주제를 더 잘 이해하기위한 설명이나 링크가 있습니까? 감사합니다.

  • 답변 # 1

    질문의 코드는 개체 참조를 수정합니다.

    기본 값과 달리 두 변수는 동일한 객체를 참조 할 수 있습니다. 결과적으로 개체 참조를 사용하여 개체를 수정하면 실제 개체가 수정되고 변경 사항이 모든 개체 참조에 반영됩니다.

    예:

    다음 코드 스 니펫은 예를 보여줍니다.

    const obj = { name: 'John' };
    const obj2 = obj;
    obj2.name = 'Mike';
    console.log(obj);
    
    

    위의 코드 예제에서 obj2.name 변경되었지만 언제 obj 마지막 줄에 기록 된 name 속성이 "Mike"로 변경됩니다. 이것은 둘 다 objobj2 가리키다메모리의 동일한 객체.

    질문의 코드를 이해하려면 위의 코드 예제를 염두에두고 작동 방식을 이해해야합니다.

    다음은 방법을 설명하는 단계입니다. removeLast() 방법 작동 :

    목록이 비어 있는지 확인하십시오. 그렇다면 제거 할 항목이 없기 때문에 함수에서 돌아갑니다.

    if (!this.head) {
       return;
    }
    
    

    연결 목록에 노드가 하나만있는 경우 head 가리키다 null 그런 다음 함수에서 돌아갑니다.

    if (!this.head.next) {
       this.head = null;
       return;
    }
    
    

    이제 연결 목록에서 두 번째 마지막 노드에 도달하기 위해 연결 목록을 탐색해야합니다. 두 번째 마지막 노드에 도달하면 next 두 번째 마지막 노드의 null . 이것은 마지막 노드에 대한 모든 참조를 제거합니다.

    // create a temporary pointer to the first node 
    // in the linked list       
    let previous = this.head;
    // create a temporary pointer to the second node
    // in the linkedlist. "this.head.next" could be "null"
    // if there's only 1 node in the linkedlist 
    let node = this.head.next;
    // traverse the linkedlist until "node.next" is not "null"
    while (node.next) { 
       // point "previous" to the node that is pointed
       // to by "node" variable
       previous = node;
       // update "node" variable to point the node that
       // is next to the node that is currently pointed to by "node"
       // variable
       node = node.next;
    }
    
    

    3 단계 후 previous 연결 목록에서 두 번째 마지막 노드를 가리 킵니다. 마지막으로 next 두 번째 마지막 노드의 null . 이렇게하면 마지막 노드가 제거됩니다.

    previous.next = null;
    
    

관련 자료

  • 이전 gnu make - Makefile 대상에서 루프 구현 시도
  • 다음 android - Flutter Firestore [cloud_firestore/not-found] 일부 요청 된 문서를 찾을 수 없습니다