본문 바로가기
알고리즘

[알고리즘] [9] 연결리스트

by Parsler 2024. 2. 5.

1. 리스트 (List)

  • 순서를 가지는 데이터의 집합으로 추상 자료형이다.
  • 데이터의 중복이 허용된다.
  • 구현 방법에 따라 크게 순차 리스트, 연결 리스트로 나뉜다.

2. 순차 리스트 : 배열을 기반으로 구현되는 리스트

  • 1차원 배열에 순서대로 저장한다.
  • 배열의 인덱스로 데이터에 접근한다.
  • 특정 위치에 원소를 삽입 후 삽입 위치 다음의 항목을 뒤로 이동한다.
  • 특정 위치의 원소를 삭제 후 뒤의 원소들을 앞으로 이동시킨다.
  • 단순 배열을 이용한 순차 리스트는 자료의 삽입 및 삭제에 소요되는 시간이 크다.

3. 연결 리스트 : 메모리의 동적 할당을 기반으로 구현되는 리스트

  • 자료의 논리적 순서와 메모리 상의 물리적 순서가 일치하지 않는다.
  • 개별적으로 위치하는 각 원소를 연결하여 전체 자료 구조를 구성한다.
  • 원소의 물리적인 순서를 맞추는 작업을 필요로 하지 않으며, 자료구조의 크기를 동적으로 조정할 수 있다.
  • 메모리의 효율적인 사용이 가능하다.

연결 리스트의 구조

  • 노드 : 연결 리스트에서 원소를 표현하는 building block
    >> 데이터 필드 (Data) : 원소의 값을 저장한다.
    >> 링크 필드 (Link) : 다음 노드의 참조값을 저장한다.

  • 헤드 : 연결 리스트의 첫 노드에 대한 참조값을 가진다.

연결 리스트의 종류

  • 단순 연결 리스트
  • 이중 연결 리스트
  • 원형 연결 리스트

4. 연결 리스트를 활용한 스택 구현

// 각각의 노드는 자신의 data와 자신과 연결된 link로 구성된다.
// 단순 연결 리스트
public class Node<T> {

	public T data;
	public Node<T> link;
	
	public Node(T data) {
		super();
		this.data = data;
	}

	public Node(T data, Node<T> link) {
		super();
		this.data = data;
		this.link = link;
	}

	@Override
	public String toString() {
		return "Node [data=" + data + ", link=" + link + "]";
	}
}
import java.util.EmptyStackException;

public class StackLinkedList<E> implements IStack<E> {

	private Node<E> top;
	
	@Override
    // 들어온 e의 data와 기존 top의 link를 top에 삽입한다.
	public void push(E e) {
		top = new Node<E>(e, top);
	}

	@Override
	public E pop() {
		if (isEmpty()) throw new EmptyStackException();
		Node<E> popNode = top;
		top = popNode.link;
		popNode.link = null;
		
		return popNode.data;
	}

	@Override
	public boolean isEmpty() {
		return top == null;
	}

	@Override
	public int size() {
		int cnt = 0;
		// size 계산 시 다음과 같이 반복문 작성이 가능하다.
		for (Node<E> temp = top; temp != null; temp = temp.link) ++cnt;
		return cnt;
	}

	@Override
	public E peek() {
		if (isEmpty()) throw new EmptyStackException();
		return top.data;
	}

}