algorithm/자료구조

연결 리스트에서 노드(Node)란?

yongfront 2024. 2. 16. 16:10
반응형
SMALL

연결 리스트에서 노드(Node)는 리스트의 기본 단위로, 데이터와 다음 노드에 대한 참조(포인터)를 포함하는 객체나 구조체입니다. 연결 리스트는 이러한 노드들이 서로 연결되어 있는 구조로, 각 노드는 다음 노드를 가리키는 방식으로 연결됩니다. 연결 리스트의 각 요소를 노드라고 부르며, 각 노드는 최소 두 부분으로 구성됩니다:

  1. 데이터(Data): 노드가 저장하고 있는 실제 값이나 정보입니다. 이 데이터는 정수, 문자열, 또는 복잡한 객체와 같은 어떤 타입도 될 수 있습니다.
  2. 참조(Next Pointer): 다음 노드를 가리키는 포인터나 참조입니다. 이를 통해 연결 리스트의 다음 요소와 연결됩니다. 마지막 노드의 경우, 이 포인터는 일반적으로 null이나 리스트의 끝을 나타내는 특별한 값을 가집니다.

연결 리스트는 이러한 노드들이 서로 연결된 형태로 데이터를 저장하며, 배열과 달리 노드들이 연속적인 메모리 위치에 저장될 필요가 없습니다. 이 특성 때문에 연결 리스트는 동적인 크기 조정이 가능하고, 요소의 삽입과 삭제가 용이하지만, 임의 접근(random access)의 성능은 배열보다 떨어집니다.

연결 리스트는 크게 세 가지 기본 유형으로 나뉩니다:

  1. 단일 연결 리스트(Singly Linked List): 각 노드가 다음 노드만을 가리키는 가장 간단한 형태의 연결 리스트입니다.
  2. 이중 연결 리스트(Doubly Linked List): 각 노드가 이전 노드와 다음 노드 양쪽을 가리키는 포인터를 가지고 있어, 양방향으로 순회할 수 있는 형태입니다.
  3. 원형 연결 리스트(Circular Linked List): 마지막 노드가 첫 번째 노드를 가리키는 형태로, 연결 리스트가 원형으로 연결되어 있습니다. 단일 연결 리스트나 이중 연결 리스트 모두 원형 형태를 가질 수 있습니다.

연결 리스트는 데이터의 동적 관리에 유용하며, 스택, 큐, 그래프와 같은 다른 추상 자료형의 구현에도 사용됩니다.

 

 

JavaScript에서 단일 연결 리스트와 노드를 구현하는 예시는 다음과 같습니다. 이 예제에서는 간단한 연결 리스트를 만들고, 노드를 추가하며, 리스트를 순회하여 모든 노드의 데이터를 출력합니다.

노드 클래스 정의

먼저, 연결 리스트의 각 요소인 노드를 정의하는 Node 클래스를 만듭니다. 노드는 데이터(data)와 다음 노드를 가리키는 포인터(next)를 멤버로 가집니다.

class Node {
  constructor(data) {
    this.data = data; // 노드에 저장될 데이터
    this.next = null; // 다음 노드를 가리키는 포인터, 초기값은 null
  }
}

연결 리스트 클래스 정의

이제 연결 리스트를 관리할 LinkedList 클래스를 정의합니다. 이 클래스는 리스트의 첫 번째 노드를 가리키는 head 포인터를 가지며, 노드를 추가하고 리스트를 출력하는 메소드를 포함합니다.

class LinkedList {
  constructor() {
    this.head = null; // 리스트의 첫 번째 노드를 가리키는 포인터
  }

  // 연결 리스트의 끝에 새 노드 추가
  append(data) {
    const newNode = new Node(data);
    if (this.head === null) {
      this.head = newNode; // 리스트가 비어있으면 새 노드를 head로 설정
    } else {
      let current = this.head;
      while (current.next !== null) {
        current = current.next; // 마지막 노드를 찾기 위해 리스트를 순회
      }
      current.next = newNode; // 마지막 노드의 next로 새 노드를 설정
    }
  }

  // 연결 리스트의 모든 노드를 순회하며 데이터 출력
  printList() {
    let current = this.head;
    while (current !== null) {
      console.log(current.data);
      current = current.next; // 다음 노드로 이동
    }
  }
}

연결 리스트 사용 예

아래의 코드는 LinkedList 클래스를 사용하여 노드를 추가하고, 연결 리스트의 내용을 출력하는 예제입니다.

const list = new LinkedList();

// 노드 추가
list.append(1);
list.append(2);
list.append(3);

// 연결 리스트 출력
list.printList(); // 출력: 1 2 3

이 예제에서는 먼저 **LinkedList**의 인스턴스를 생성하고, append 메소드를 사용하여 세 개의 노드(데이터가 각각 1, 2, **3**인)를 리스트의 끝에 추가합니다. 마지막으로 printList 메소드를 호출하여 연결 리스트에 저장된 모든 데이터를 순서대로 출력합니다.

JavaScript에서 연결 리스트를 구현하는 방법은 다양한 데이터 구조와 알고리즘 문제를 해결하는 데 유용한 기초를 제공합니다.

728x90
반응형
LIST