카테고리 없음

파이썬으로 링크드 리스트 구현하기

effortDev 2020. 6. 8. 15:04


1. 링크드 리스트란?





- 배열의 단점을 극복하기 위해 만들어짐

- 배열은 미리 메모리 사이즈를 할당하고 사용해야 함

- 메모리할당을 미리예약하지않고 필요할때마다 데이터를 추가추가할수 있는 구조

- 데이터 + next 데이터를 가르킬 주소를 하나의 데이터라고 보면 된다.

- 그런테 이것을 데이터라고 부를수 없어 데이터와 주소를 하나로 부르는 것을 노드라고 한다.

- 다음 데이터를 가르킬 주소라고 하기도 하지만 포인터라고 얘기한다.


링크드 리스트는 노드와 노드의 연결이다.

노드는 데이터와 다음 노드의 연결정보를 갖는 공간이다.



2. 링크드 리스트 구현


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
class Node:
    def __init__(self, data):
        self.data = data
        self.next = None
 
class NodeMgmt:
    def __init__(self, data):
        self.head = Node(data)
    
    def add(self, data):
        if self.head == '':
            self.head = Node(data)
        else:
            node = self.head
            while node.next:
                node = node.next
            node.next = Node(data)
    
    def desc(self):
        node = self.head
        while node:
            print(node.data)
            node = node.next
    
    def delete(self, data):
        # 헤드값 없을때
        if self.head == '':
            print("해당값을 가진 노드가 없습니다.")
            return
 
        # 지우는값이 헤드값일때
        if self.head.data == data:
            tmp = self.head
            self.head = self.head.next
            del tmp
        else:
            # 지우는 값이 중간값일때
            node = self.head
            while node.next:
                if node.next.data == data:
                    temp = node.next
                    node.next = node.next.next
                    del temp
                    return
                else:
                    node = node.next
 
linkedlist1 = NodeMgmt(0# 0
linkedlist1.add(1# 0 1
linkedlist1.add(2# 0 1 2
linkedlist1.add(3# 0 1 2 3
 
linkedlist1.desc() # 0 1 2 3
 
linkedlist1.delete(1# 0 2 3
 
linkedlist1.desc() # 0 2 3
cs


링크드 리스트는 데이터가 계속 체이닝 되어서 찾아가는것인데

노드가 10000개 있고 찾으려는 데이터값이 9000번대에 있다면 

맨 앞에서부터 링크드 되어있는 리스트의 값을 찾아가야 한다.  


하지만 뒤에서부터 찾는다면 1000번만 찾으면 값을 찾을 수 있다.

prev, tail을 갖는 것이 더블 링크드 리스트이다.


더블링크드 리스트는 추후에 정리할 예정이다.