자료구조 - Linked List

Linked List는 노드 들간의 연결된 포인터들로 구성되는 자료구조이다. 배열과 같이 원소가 선형으로 저장된다는 특성이 있지만 배열과는 달리 중간에 원소의 삽입 삭제가 가능하고 중간에 있는 원소에 접근하기 위해서는 Head에서부터 순차적으로 접근해서 찾는 방식을 취할 수 밖에 없다.

배열과 Linked List는 다음과 같은 차이점을 가지고 있다.

  • Linked List
    • 원소에 대한 접근을 Head부터 다음 노드로 순차적으로 찾아가야 하기 때문에 검색시간은 O(n)이다.
    • 원소를 중간에 삽입, 삭제하는 것이 매우쉽다 ( 전 후 노드가 가르키는 포인터를 바꾸어 주면 된다. )
    • List로 연결된 요소들이 메모리상에 연속적으로 저장되지 않아도 된다.
  • 배열
    • 메모리상에 연속적으로 저장된 공간이므로 첫주소만 알면 상대적인 주소를 계산해 상수시간 O(1)으로 원소에 접근이 가능하다.
    • 원소를 중간에 삽입,삭제하는 것이 어렵다. 연속된 저장공간이기 때문에 배열의 할당크기를 늘려주어야 하고 삽입하는 지점부터의 원소들을 다시 복사해 주어야 한다.
    • 배열은 메모리상에 연속적으로 저장되어 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
#include <cstdio>
#include <stdlib.h>
#define INF -987654321

using namespace std;


typedef struct Node
{
Node* prev;
Node* next;
int value;

Node(int v)
{
value = v;
}
}node;

class LinkedList
{
private:
Node* head;
Node* tail;
int size = 0;
public:

LinkedList()
{

}
int getSize()
{
return size;
}

void pushFront(int value)
{
Node* target = (Node*)malloc(sizeof(Node));
target->prev = NULL;
target->next = NULL;
target->value = value;

if (head == NULL)
{
head = target;
tail = target;
}
else
{
head->prev = target;
target->next = head;
head = target;
}
size++;
}

void pushBack(int value)
{
Node* target = (Node*)malloc(sizeof(Node));
target->value = value;

target->prev = NULL;
target->next = NULL;

if (tail == NULL)
{
head = target;
tail = target;
}
else
{
tail->next = target;
target->prev = tail;
tail = target;
}
size++;
}

void insertAt(int index, int value)
{
Node* offset = head;
bool exist = true;
while (index--)
{
if (offset->next != NULL)
offset = offset->next;
else
exist = false;
}

if (exist)
{
Node* target = (Node*)malloc(sizeof(Node));

target->prev = offset->prev;
target->next = offset;
target->value = value;

if (offset->prev->next != NULL)
offset->prev->next = target;
offset->prev = target;

size++;
}
else
{
printf("That Node Not Exist!\n");
}
}

int popFront()
{
if (head == NULL)
{
return INF;
}
else
{
size--;
int value = head->value;
head = head->next;
return value;
}
}

int popBack()
{
if (tail == NULL)
{
return INF;
}
else
{
size--;
int value = tail->value;
tail = tail->prev;

return value;
}
}



};

void main()
{
LinkedList l1;

for (int i = 0; i < 10; i++)
l1.pushBack(i);

while (l1.getSize() != 0)
{
if (l1.getSize() % 2 == 0)
printf("%d ", l1.popBack());
else
printf("%d ", l1.popFront());
}

}
공유하기