[Algorithm] 연결리스트(Linked List)
CS/Algorithm 이론

[Algorithm] 연결리스트(Linked List)

연결리스트(Linked List)

 

-정의: 각 노드가 데이터와 포인터를 가지고 한 줄로 연결되어 있는 방식으로 데이터를 저장하는 자료 구조이다. 이름에서 말하듯이 데이터를 담고 있는 노드들이 연결되어 있는데, 노드의 포인터가 다음이나 이전의 노드와의 연결을 담당한다.

 

-특징

    (1) 원소들은 메모리 상에 불연속적으로 위치하고 있어도 무방

 

-종류

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

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

        -정의: 각 노드에 자료 공간과 한 개의 포인터 공간이 있고, 각 노드의 포인터는 다음 노드를 가리킴

 

    (2) 이중 연결리스트(Doubly LInked List)

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

        -정의: 구조는 단일 연결 리스트와 비슷하지만, 포인터 공간이 두 개가 있고 각각의 포인터는 앞의 노드와 뒤의 노드를 가리킨다.

   

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

 

단순 원형 연결리스트(Circular LInked List)

        -정의: 일반적인 연결 리스트에 마지막 노드와 처음 노드를 연결시켜 원형으로 만든 구조이다.

 

 

-시간복잡도

 

    (1) 임의의 위치에 원소를 추가: O(1)

 

    (2) 임의 위치의 원소를 제거: O(1)

 

    (3) 임의의 위치의 원소값 확인/변경: O(N)

 

-C의 구조체 + 동적할당을 이용한 구현 (면접 단골문제)

 

-STL List: Doubly Linked List 구조.

 

-문제 백준 1406번 에디터 https://www.acmicpc.net/problem/1406

 

내 코드

 

    - STL list의 erase함수의 return 값: 해당 함수에 의해 지워진 값을 다 값을 가리키는 iterator

    ( An iterator pointing to the element that followed the last element erased by the function call

 

    - STL list (주의 : end는 마지막 원소가 아닌 끝을 표시하는 것, 마지막 값을 사용하려면 list.end()--를 해줘야 함)

 

        begin(): list의 시작 원소를 가리키는 반복자를 반환한다.

 

        end(): list의 끝 표시 반복자를 반환한다.

 

#include <iostream>
#include <string>
#include <list>

using namespace std;

int main(void) {

	string tmp;
	list<char> arr;

	getline(cin, tmp);
    
    //문자열 list에 저장
	for (int i = 0; i < (int)tmp.size(); i++) arr.push_back(tmp[i]);

	list<char>::iterator now = arr.end();
	int num = 0;
	cin >> num;
    
	for (int i = 0; i < num; i++) {
		char tmp = NULL;
		cin >> tmp;

		if (tmp == 'L') {
			if (now == arr.begin())	continue;
			now--;
		}
		else if (tmp == 'D') {
			if (now == arr.end()) continue;
			now++;
		}
		else if (tmp == 'B') {
			if (now != arr.begin()) {
				now--;
				now = arr.erase(now);
			}
		}
		else if(tmp == 'P') {
			cin >> tmp;
			arr.insert(now, tmp);
		}
	}

	//출력
	list<char>::iterator it = arr.begin();
	for (it = arr.begin(); it != arr.end(); it++) {
		cout << *it;
	}
	
	return 0;
}

 

 

 

 

 

 

 

참고

https://blog.encrypted.gg/725?category=773649

https://ko.wikipedia.org/wiki/%EC%97%B0%EA%B2%B0_%EB%A6%AC%EC%8A%A4%ED%8A%B8

 

 

 

 

 

728x90
반응형

'CS > Algorithm 이론' 카테고리의 다른 글

[Algorithm] 덱 (Deque)  (0) 2019.11.03
[Algorithm] 큐 (Queue)  (0) 2019.10.30
[Algorithm] 스택 (Stack)  (0) 2019.10.30
[Algorithm] 배열  (0) 2019.10.14
[Algorithm] 공간 / 시간 복잡도 분석  (0) 2019.09.04