O(nlogn) → 정렬을 할때의 시간복잡도.
two pointer → ex. [1,3,5,7,2] 여기서 두개의 포인터를 가지고 문제를 해결하는 방법. 거의 정렬이 된 상태에서 쓰임
.sort() —> 정렬함수
Linked list 는 node로 구성.
Linked list는 node라는 구조체가 연결되는 형식.
node → 데이터 값과 next node의 주소값을 저장.
node → {value: next data}
linkedlist는 메모리상에서는 비연속적으로 저장되어있지만,
각각의 node가 next node의 메모리 주소값을 가리킴 → 논리적인 연속성.
물리적 비연속적, 논리적 연속적
각 node들은 데이터 저장 & next node의 address정보도 가짐.
—> 논리적 연속성 유지하며 연결 가능.
Array의 경우 → 연속성을 유지하기 위해 메모리 상에서 순차적으로 데이터를 저장하는 방식 사용.
Linked list의 경우 → 메모리상에서 연속성을 유지하지 않아도 되기 때문에 메모리 사용이 좀 더 자유롭다.
but, next node의 address도 추가적으로 저장해야 하기 때문에 데이터 하나당 차지하는 메모리가 더 커짐.
<Node 구현>
class Node:
def __init__(self, value = 0, next = None):
self.value = value
self.next = next
first = Node(1)
second = Node(2)
third = Node(3)
first.next = second
second.next = third
first.value = 6
insert_back() ( append() 구현 )
class LinkedList(object):
def __init__(self):
self.head = None
def append(self, value):
new_node = Node(value)
if self.head is None:
self.head = new_node
# 맨 뒤의 node가 new_node를 가리켜야 한다.
else:
current = self.head
while(current.next):
current = current.next
current.next = new_node
Linked list Operations
insert_back (tail version O(1))