본문 바로가기
게임 개발(유니티)/멋쟁이 사자처럼 3기_회고록

[멋쟁이사자처럼 유니티 TIL] 2024_12_03(화) 강의 요약 및 정리(2)_단일 링크 리스트

by goraku97 2024. 12. 3.

단일 이중 링크 리스트 코드정리

단일 링크 코드정리

 

 

public class Node<T>

// 이 클래스는 단일 연결 리스트에서 하나의 노드(Node)를 나타냄

  **<T>는 데이터 타입을 유연하게 설정할 수 있도록 사용.

    ex. Node<int>를 사용하면 데이터 타입이 int로 제한

          Node<string>은 문자열을 저장할 수 있는 노드가 됨.

 

public T Data { get; set; }

- Data { get; set; }:

  // 프로포티를 사용. 이 노드가 저장하는 데이터를 나타냄.

- T

  // T (제네릭 타입)으로, 사용자가 설정한 데이터 타입에 따라 달라짐

 

public Node<T> Next { get; set; }

- Next { get; set; }:

 // 프로퍼티를 사용. 연결 리스트에서 다음 노드를 가리키는 참조

  새 노드 생성 시 null로 초기화(새 노드가 리스트의 끝에 있음)

- Node<T>

 // (동일한 클래스 타입)

 

public Node(T data) { Data = data; Next = null; }

- T data

 // 매개변수로, 노드가 저장할 데이터를 받아옴.

- { Data = data; Next = null; }

 // Data 속성에 매개변수로 받은 data를 할당

 // Next 속성을 null로 초기화

** 새 노드를 생성할 때, 데이터를 초기화하고 다음 노드 참조를 설정

public class LinkedListCustom<T>

// LinkedListCustom<T>는 단일 연결 리스트를 구현하는 클래스

  ( 각 노드가 데이터다음 노드에 대한 참조를 가지고 있음)

 

public Node<T> Head { get; private set; }

- Node<T> Head :

  // 연결 리스트의 첫 번째 노드(Head) 를 가리키는 속성

     리스트가 비어 있으면 Head는 null

- private set

  // 외부에서는 Head를 수정할 수 없고, 내부에서만 변경 가능

    즉, 외부 클래스에서 읽기만 가능(설정은 불가능)

 

public void AddLast(T data)

- T data:

  // 새 노드에 저장할 매개변수 데이터

- AddLast:

  // 연결 리스트의 에 새로운 노드를 추가

 

Node<T> newNode = new Node<T>(data);

- Node<T> newNode:

 // 클래스의 타입을 제네릭으로 정의하고 있으며,

    T는 Node에 저장될 데이터의 타입을 나타냄

- new Node<T>(data):

 // Node<T> 클래스의 생성자를 호출하여 새로운 Node 객체를 만듬

    성자는 data를 받아 그 값을 Data 속성에 설정

 

*** 해당코드가 없으면, 새로운 노드를 생성할 수 없게 됨

  

 

if (Head == null) { Head = newNode; }

// 만약 Head 가 비어있다면 (Head == null)

  새로운 노드를 생성하고 Head가 그 노드를 가리키게함.

 

else { Node<T> current = Head;

// if 문이 false 면 해당 else문을 실행

 

while (current.Next != null) { current = current.Next; }

- while (current.Next != null)

 // current.Next는 현재 노드의 다음 노드를 가리킴.

 // 다음 노드가 비어있지 않다면(!= null) 하기 코드를 반복실행

- current = current.Next;

 // current는 하나씩 다음 노드를 가리키고

    current.Next를 통해 다음 노드로 이동

    마지막 노드에 도달하면 current.Nextnull이 되어 조건이 false가 되고, 반복문이 종료

 

*** 리스트의 마지막 노드를 찾는 역할

 

current.Next = newNode;

// 새로운 노드를 리스트의 끝에 연결할 수 있게 하는 코드.

*** 해당 코드가 없다면, 2번째 이상 리스트가 추가되지 않음.

current.Next = newNode;가 없으면 첫 번째 노드의 Next새로운 노드를

가리키게 되지 않기 때문에, 리스트는 여전히 첫 번째 노드만을 가리키고 있으며,

두 번째 노드는 연결되지 않게 됨.

   

public void AddFirst(T data)

- T data:

   새 노드에 저장할 매개변수 데이터

- AddFirst :

   연결 리스트의 처음새로운 노드를 추가

 

Node<T> newNode = new Node<T>(data);

- Node<T> newNode:

 // 클래스의 타입을 제네릭으로 정의하고 있으며,

    T는 Node에 저장될 데이터의 타입을 나타냄

- new Node<T>(data):

 // Node<T> 클래스의 생성자를 호출하여 새로운 Node 객체를 만듬

    성자는 data를 받아 그 값을 Data 속성에 설정

 

*** 해당코드가 없으면, 새로운 노드를 생성할 수 없게 됨

 

if (Head == null) { Head = newNode; }

// 만약 Head 가 비어있다면 (Head == null)

   새로운 노드를 생성하고(newNode), 새로 생성한 노드를 첫 번째 노드(Head)로 설정

   즉, 새 노드가 첫 번째이자 유일한 노드로 됨

 

else { newNode.Next = Head;  Head = newNode;  }

// if 문이 false라면, 해당 코드를 실행

- newNode.Next = Head

  // 새 노드의 Next 속성에 현재의 Head를 할당

- Head = newNode;

  // Head를 newNode로 설정하여, 새로운 노드를 리스트의 첫 번째 노드로 만듬

    이제 Head는 새로 추가된 노드를 가리키게 됨.

 

*** 해당 코드가 없다면 리스트의 첫 번째 노드를 제대로 업데이트할 수 없게 되어

     새 노드를 추가하는 동작이 실패하게 됨.

 

public void Traverse()

// 연결 리스트를 순차적으로 탐색하고 각 노드의 데이터를 출력하는 함수.

 

Node<T> current = Head;

// current를 리스트의 Head로 설정

 

while (current != null)

// current가 null이 아니라면, 하기의 코드를 반복.

 

Debug.Log(current.Data);

// current 노드의 데이터를 출력

current = current.Next;

// current를 다음 노드로 갱신

 (연결된 리스트의 다음 노드로 이동)

 

이중 링크 코드정리

public class DNode<T>

// 이 클래스는 이중 연결 리스트에서 하나의 노드(Node)를 나타냄

   이 클래스는 각 노드가 두 개의 포인터 (Next와 Prev)를 가지고 있어서,

   리스트의 양방향 탐색을 지원

public T Data { get; set; }

- Data { get; set; }:

  // 프로포티를 사용. 이 노드가 저장하는 데이터를 나타냄.

- T

  // T (제네릭 타입)으로, 사용자가 설정한 데이터 타입에 따라 달라짐

 

public DNode<T> Next { get; set; }

// 다음 노드를 가리키는 포인터

 

public DNode<T> Prev { get; set; }

// 이전 노드를 가리키는 포인터

 

public DNode(T data)

- T data

 // 매개변수로, 노드가 저장할 데이터를 받아옴.

 

Data = data;

Next = null;

Prev = null;

// 노드의 데이터를 설정

// 노드의 'Next' 포인터는 처음에 null로 설정  

// 노드의 'Prev' 포인터는 처음에 null로 설정

public class DLinkedListCustom<T>

// 이중 연결 리스트(Doubly Linked List)의 구현을 나타내는 클래스

  노드를 양방향으로 연결하여, 앞뒤로 자유롭게 탐색할 수 있도록 합니다.

  (각 노드는 이전 노드다음 노드를 참조할 수 있음)

 

public DNode<T> Head { get; private set; }

// 리스트의 첫 번째 노드( Head )를 가리킴

 

public DNode<T> Tail { get; private set; }

// 리스트의 마지막 노드( Tail )을 가리킴

 

public void AddLast(T data)

- T data:

 //  새 노드에 저장할 매개변수 데이터

 

 // 이 메서드는 리스트의 마지막에 노드를 추가하는 메서드.

    하기의 코드를 실행.

 

DNode<T> newNode = new DNode<T>(data)

- Node<T> newNode:

 // 클래스의 타입을 제네릭으로 정의하고 있으며,

    T는 Node에 저장될 데이터의 타입을 나타냄

- new Node<T>(data):

 // Node<T> 클래스의 생성자를 호출하여 새로운 Node 객체를 만듬

    성자는 data를 받아 그 값을 Data 속성에 설정

 

if (Tail == null){ Tail = Head = Node }

// 만약 마지막노드가 없다면, 하기의 코드를 실행.

// Head와 Tail이 newNode를 가리키게 하고, 리스트에 첫 번째 노드를 추가.

 

else

상기의 if 문이 false 면 해당 코드를 실행

 

node.Prev = Tail;

// 새로 생성된 노드(node)의 Prev 현재 Tail로 설정

   새 노드는 현재의 Tail 노드를 이전 노드로 가리키게 됨.

Tail.Next = node;

// 기존의 Tail 노드의 Next를 새 노드를 가리키도록 설정

   Tail의 다음 노드는 새로 추가된 노드가 됨.

Tail = newNode;

// 마지막으로 Tail을 새 노드로 업데이트.

   (즉 기존이 아닌, 새로 생성된 노드가  Tail이 됨) 

 

public void AddFirst(T data)

- T data:

 //  새 노드에 저장할 매개변수 데이터

 

 // 이 메서드는 리스트의 맨 앞에 노드를 추가하는 메서드.

    하기의 코드를 실행.

 

DNode<T> node = new DNode<T>(data)

- Node<T> newNode:

 // 클래스의 타입을 제네릭으로 정의하고 있으며,

    T는 Node에 저장될 데이터의 타입을 나타냄

- new Node<T>(data):

 // Node<T> 클래스의 생성자를 호출하여 새로운 Node 객체를 만듬

    성자는 data를 받아 그 값을 Data 속성에 설정

 

if (Tail == null) { Tail = Head = Node }

// Tail 이 존재하지 않다면(리스트에 노드가 하나도 없다면) 

  /Head와 Tail이 newNode를 가리키게 하고, 리스트에 첫 번째 노드를 추가.

 

else

// 상기의 if 문이 false 면 하기 코드를 실행

 

node.Next = Head;

// 새 노드의 다음 노드(Next)를 기존의 Head로 설정

Head.Prev = node;

// 기존 Head 노드의 이전 노드(Prev)를 새 노드로 설정

Head = node;

// 새 노드를 새로운 Head로 설정

 

**이제 새 노드가 리스트의 맨 앞에 위치

 

public void Traverse()

// 연결 리스트를 순차적으로 탐색하고 각 노드의 데이터를 출력하는 함수.

 

DNode<T> current = Head;

// current를 리스트의 Head로 설정

 

while (current != null)

// current가 null이 아니라면, 하기의 코드를 반복.

 

Debug.Log(current.Data);

// current 노드의 데이터를 출력

current = current.Next;

// current를 다음 노드로 갱신

 (연결된 리스트의 다음 노드로 이동)

 

public class ListExample : MonoBehaviour{}

// ListExample 이라는 클래스. 

 

void Start()

// 하기의 코드는 게임실행시 1번만 실행되어야 하기 때문에, Start 함수 사용.

 

Debug.Log("--------Single---------");

// "--------Single---------" 을 콘솔에 출력

 

LinkedListCustom<int> List = new LinkedListCustom<int>();

// 새로운 정수형 단일 링크드 리스트 객체를 생성(new LinkedListCustom<int>();)

   하고, 이를 List 변수(LinkedListCustom<int> List )에 할당

 

List.AddLast(data: 1);

List.AddLast(data: 2);

List.AddLast(data: 3);

List.AddLast(data: 4);

// AddLast 함수에  상기의 데이터 를 추가하고 순회

  (리스트의 끝에 1, 2, 3, 4를 차례로 추가)

 

List.AddFirst(data: 5);

// AddFirst 함수에 상기의 데이터를 추가

 (리스트의 맨 앞에 5를 추가)

 

List.Traverse();

// Traverse() 함수를 실행시켜, 데이터를 콘솔창에 출력하게 함

 

Debug.Log("--------Double---------");

// " --------Double---------" 을 콘솔에 출력

 

DLinkedListCustom<int> list = new DLinkedListCustom<int>();

// 새로운 정수형 이중 링크드 리스트 객체를 생성(new DLinkedListCustom<int>();)

   하고, 이를 List 변수(DLinkedListCustom<int> List )에 할당

 

list.AddLast(10);

list.AddLast(20);

list.AddLast(30);

list.AddLast(40);

// AddLast 함수에  상기의 데이터 를 추가하고 순회

  (리스트의 끝에 10, 20, 30, 40를 차례로 추가)

 

list.AddFirst(40);

// AddFirst 함수에 상기의 데이터를 추rk

 (list.AddLast(40);이 리스트 가장 처음으로 설정)

 

list.Traverse();

//  Traverse() 함수를 실행시켜, 데이터를 콘솔창에 출력하게 함