1. 한방향 연결리스트의 특징
노드(node) : data정보와 다른 노드로 연결시켜주는 링크로 이루어져있는 class
노드들을 한 쪽 방향으로만 연결시킨 자료구조
가장 앞에 있는 노드를 head라고 부르며 head 노드를 통해서 한방향 연결리스트에 접근할 수 있다.
2. 한방향 연결리스트의 장단점
○장점
1.추가 및 삽입에 용이한 자료구조이다.
2.메모리를 효율적으로 관리할 수 있다.
○단점
1.데이터를 탐색하기 위해서는 처음 head부분부터 탐색해야 하기 때문에 탐색에 비효율적이다.
3.시간복잡도
pushFront() : O(1)
pushBack() : O(n)
popFront() : O(1)
popBack() : O(n)
search : O(n)
remove : O(n)
4.한방향 연결리스트 구현
class Node:
def __init__(self, key=None):
self.key = key
self.next = None
def __str__(self):
return str(self.key)
class SinglyLinkedList:
def __init__(self):
self.head = None
self.size = 0
def __len__(self):
return self.size
def printList(self):
v = self.head
while(v):
print(v.key, "->", end=" ")
v = v.next
print("None")
def pushFront(self, key):
new_Node = Node(key)
new_Node.next = self.head
self.head = new_Node
self.size += 1
def pushBack(self, key):
new_Node = Node(key)
if self.size == 0:
self.head=new_Node
else:
tail = self.head
while tail.next !=None:
tail=tail.next
tail.next=new_Node
self.size+=1
def popFront(self):
# head 노드의 값 리턴. empty list이면 None 리턴
if self.size==0:
return None
else:
x=self.head
key = x.key
self.head = x.next
self.size = self.size -1
del x
return key
def popBack(self):
# tail 노드의 값 리턴. empty list이면 None 리턴
if self.size ==0:
return None
else:
prev,tail=None,self.head
while tail.next!=None:
prev=tail
tail=tail.next
if prev ==None:
self.head=None
else:
prev.next=tail.next
key = tail.key
del tail
self.size -=1
return key
def search(self, key):
# key 값을 저장된 노드 리턴. 없으면 None 리턴
v=self.head
while v!=None:
if v.key==key:
return v
v=v.next
return v
def remove(self, x):
# 노드 x를 제거한 후 True리턴. 제거 실패면 False 리턴
if x==None or self.size ==0:
return False
elif x==self.head:
self.popFront()
return True
else:
prev,tail=None,self.head
while tail!=x:
prev=tail
tail=tail.next
prev.next=tail.next
del x
self.size = self.size -1
return True
5. 함수 추가
reverse(key) : key 를 가지는 첫 노드에서 부터 끝 노드 까지 반대로 뒤집는 함수 (숫자만 입력 가능)
findMax() : 최대값을 갖는 노드를 찾아서 그 key값을 리턴하는 함수
deleteMax() : 최대값을 갖는 노드를 제거하는 함수
def reverse(self, key):
i=None
j=self.head
while j!=None:
if j.key==key:
break
i=j
j=j.next
if j==None:
return
prev=j
tail=j.next
j.next=None
if tail==None:
return
while tail.next!=None:
temp=tail.next
tail.next=prev
prev=tail
tail=temp
if i==None:
self.head=tail
tail.next
else:
i.next=tail
tail.next=prev
def findMax(self):
# self가 empty이면 None, 아니면 max key 리턴
if self.size==0:
return None
prev=self.head
v=prev.key
tail=prev.next
while tail!=None:
if v<tail.key:
v=tail.key
tail=tail.next
elif v>=tail.key:
tail=tail.next
return v
def deleteMax(self):
# self가 empty이면 None, 아니면 max key 지운 후, max key 리턴
if self.size==0:
return None
x=self.findMax()
self.remove(self.search(self.findMax()))
return x
'python > 자료구조 알고리즘' 카테고리의 다른 글
양방향(원형) 연결리스트 (0) | 2021.05.24 |
---|---|
스택(stack) (0) | 2021.05.12 |