연결리스트

GoldenDusk·2023년 8월 15일
0

알고리즘 공부

목록 보기
4/14
post-thumbnail

출처 : https://www.youtube.com/watch?v=K1PlysPgNZY&t=20s

1. 선형 구조란?


  1. 자료 구조의 분류
구조설명종류
선형 구조데이터를 연속적으로 연결한 자료 구조리스트, 스택, 큐, 데크
비선형 구조데이터를 비연속적으로 연결한 자료 구조트리, 그래프
  1. 리스트

2. 연결리스트란?

개념

  • 연속된 노드(Node)의 연결체
  • 데이터를 감싼 노드를 포인터로 연결해서 공간적인 효율성을 극개화시킨 자료 구조

노드(Node)

  • 연결리스트에서 사용되는 하나의 데이터 덩어리이며, 데이터 & 링크이 2가지의 필드를 담고 있는 구조
  • data : 노드가 담고 있는 데이터/값, 문자열, 숫자 등등 원하는 값을 넣고 저장
  • next : 링크/ 포인터 역할, 다음 노드의 주소를 저장
  • 양방향 연결 리스트의 경우 prev 포인터(이전 노드의 주소)추가

연결 리스트의 구조

  1. 마지막 연결할 것은 없기에 null과 연결
  2. 연결리스트의 첫 번째 즉, 시작 지점에 있는 것을 head라고 함
  3. 연결리스트의 마지막은 tail라고 부름

배열 vs 연결리스트

배열

  1. 배열은 메모리 공간 안에 모든 원소들이 이어진 공간에 자리 잡음
  2. 인덱스를 통해 원소 탐색을 효율적으로 빠르게 실행 가능
  3. random access 가능 : 배열의 n번째 원소 방문 시 O(1) 시간으로 가능 EX. arr[3]
  4. 원소 삽입 & 삭제 일반적으로 O(N) 시간 소요 ⇒ 원소 개수 대로 늘어남

연결리스트

  1. 이어진 메모리 공간이 아닌 불특정한 공간에 존재
  2. 그렇기 때문에 포인터, 주소를 참조하는 것을 통해 연결
  3. 노드의 탐색은 선형시간이 걸림
  4. c를 가려면 a, b를 거쳐 감
  5. random access 불가능 : 리스트의 n번째 노드 방문 시 O(N)시간 소요 ⇒ head 노드부터 n번째 노드까지 순회
  6. 상황에 따라 배열보다 빨라질 수 있는 노드 삽입 & 삭제
  7. 연결리스트의 노드를 맨 앞에 삽입 시켜줄 때는 head 노드의 참조위치만 달라지기 때문 O(1) 처리 가능

연결리스트의 종류

Singly Linked List(단일 연결 리스트)

  1. 대부분의 연결리스트의 문제의 주력
  2. 다음 노드에 대한 포인터만 가지고 있다
  3. 일방향이다.

Doubly Linked List(이중 연결 리스트)

  1. 다음 노드에 대한 포인터와 이전 노드를 가르치는 포인터를 가지고 있다.
  2. 앞 뒤로 탐색하는 게 빠르다는 장점이 있지만, 노드마다 2개의 포인터를 가져야 해서 데이터의 구조와 흐름이 복잡해질 수 있음

Circular Linked List(원형 연결 리스트)

  1. 이중연결리스트와 같지만 마지막 노드의 next 포인터가 헤드 노드를 가르친다.

연결리스트 구현 방법

노드의 구현 방법

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

연결리스트

let head = new Node("a");
head.next = new Node("b");
head.next.next = new Node("c");
head.next.next.next = new Node("d");
  1. 시작점 : head 변수에 새로운 노드를 a라는 변수와 함께 생성
  2. head라는 노드에 next라는 참조 포인터를 새로 생성할 노드 b로 지정
  3. 노드 b를 새로 생성한 노드 c로 지정
  4. 마지막 노드 지정
profile
내 지식을 기록하여, 다른 사람들과 공유하여 함께 발전하는 사람이 되고 싶다. gitbook에도 정리중 ~

0개의 댓글