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

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.Next가 null이 되어 조건이 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() 함수를 실행시켜, 데이터를 콘솔창에 출력하게 함
'게임 개발(유니티) > 멋쟁이 사자처럼 3기_회고록' 카테고리의 다른 글
| [멋쟁이사자처럼 유니티 TIL] 2024_12_04(수) 강의 요약 및 정리(2) (0) | 2024.12.04 |
|---|---|
| [멋쟁이사자처럼 유니티 TIL] 2024_12_04(수) 강의 요약 및 정리(1) (0) | 2024.12.04 |
| [멋쟁이사자처럼 유니티 TIL] 2024_12_03(화) 강의 요약 및 정리(1) (0) | 2024.12.03 |
| [멋쟁이사자처럼 유니티 TIL] 2024_12_02(월) 강의 요약 및 정리 (0) | 2024.12.02 |
| [멋쟁이사자처럼 유니티 TIL] 2024_11_29(금) 강의 요약 및 정리 (0) | 2024.12.01 |