728x90

 

list
  • 연결리스트
  • 요소가 인접한 메모리 위치에 저장 xxx인 선형 데이터 구조
  • 요소들은 next, prev라는 포인터로 연결되어 이루어지고
  • 중복을 허용

 

시간복잡도
  • 데이터를 감싼 노드를 포인터로 연결해서 공간적인 효율성을 극대화시킨 자료구조
  • 삽입과 삭제 O(1)
  • k번째 요소를 참조한다 했을 때 O(k)

 

노드
  • 노드는 아래와 같이 이루어져 있다.
    • (싱글연결리스트 기준) data
    • 노드와 노드를 잇게 만드는 next라는 포인터 
class Node {
public:
	int data;
    Node* next;
    Node(){
        data = 0;
        next = NULL;
    }
    Node(int data){
        this->data = data;
        this->next = NULL;
    }


};

 

 

분류

크게 3가지로 나뉜다.

  • 싱글 연결 리스트(Singly Linked List) 
    • next 포인터 밖에 존재하지 않으며 한 방향으로만 데이터가 연결된다.

  • 이중 연결 리스트(Doubly Linked List)
    • prev, next 두개의 포인터로 양방향으로 데이터가 연결된다.

 

  • 원형연결리스트(Circular Linked List)
    • 마지막 노드와 첫번재 노드가 연결되어 원을 형성
    • 싱글연결리스트 또는 이중연결리스트로 이루어진 2가지 타입의 원형연결리스트 

 

예시코드

 

#include <bits/stdc++.h>
using namespace std;
list<int> a;
void print(list <int> a){
    for(auto it : a) cout << it << " ";
    cout << '\n';
}
int main(){
    for(int i = 1; i <=3; i++)a.push_back(i);
    for(int i = 1; i <=3; i++)a.push_front(i);
    
    auto it = a.begin(); it++;
    a.insert(it, 1000);
    print(a);
    
    it = a.begin(); it++;
    a.erase(it);
    print(a);
    
    a.pop_front();
    a.pop_back();
    print(a);
    
    cout << a.front() << " : " << a.back() << '\n';
    a.clear();
    return 0;
}

/*
3 1000 2 1 1 2 3
3 2 1 1 2 3
2 1 1 2
2 : 2
*/

 

method

 

  • push_front(value)
    • 리스트의 앞에서 부터 value를 넣는다.
  • push_back(value)
    • 뒤에서부터 value를 넣는다.
  • insert(idx, value)
    • 요소를 idx번째에 삽입
iterator insert (const_iterator position, const value_type& val);

 

  • erase(idx)
    • 리스트의 idx번째 요소를 지운다.
iterator erase (const_iterator position);

 

  • pop_front()
    • 첫번째 요소를 지운다
  • pop_back()
    • 맨 끝 요소를 지운다.
  • front()
    • 맨 앞 요소를 참조한다.
  • back()
    • 맨 뒤 요소를 참조한다.
  • clear()
    • 모든 요소를 지운다.

 

랜덤 접근과 순차적 접근
  • 직접 접근이라고 하는 랜덤 접근(random access)
    • 동일한 시간에 배열과 같은 순차적인 데이터가 있을 때 임의의 인덱스에 해당하는 데이터에 접근할 수 있는 기능
  • 데이터를 저장된 순서대로 검색하는 순차적 접근(sequential access) 

  • vector, Array와 같은 배열은 랜덤접근이 가능해서 k번째 요소에 접근시 O(1)
  • 연결리스트, 스택, 큐는 순차적 접근만 가능해서 k번째 요소에 접근할 때 O(k) 

 

 

배열과 연결리스트 비교

  • 배열
    • 연속된 메모리 공간에 데이터를 저장
    • 삽입과 삭제 -> O(n)
    • 참조 -> O(1)
  • 연결리스트
    • 연속되지 않은 메모리 공간에 데이터를 저장
      • 삽입과 삭제 -> O(1)
      • 참조 -> O(n)

따라서, 데이터 추가 및 삭제를 많이하면 -> 연결리스트

             참조를 많이 하는 것은 -> 배열

 

728x90

'Programming Language > C++' 카테고리의 다른 글

[C++] set, multiset with Cpp  (0) 2023.12.20
[C++] map, unordered_map with Cpp  (1) 2023.12.20
[C++] Vector with Cpp  (1) 2023.12.20
[C++] Array with Cpp  (1) 2023.12.20
[C++] auto와 람다식  (0) 2023.12.20