Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 취준
- 운영체제
- CS
- 관계형데이터베이스
- SQL
- 부트캠프
- 개발
- 데이터엔지니어링
- 자료구조
- 데이터엔지니어
- 데이터베이스
- 웹자동화
- AWS
- 기술면접
- 알고리즘
- DataWarehouse
- 클라우드
- 데이터웨어하우스
- 데브코스
- Amazon
- Service
- 웹크롤링
- Django
- 개념정리
- 프로그래머스
- WEB
- 웹스크래핑
- 에어플로우
- 파이썬
- airflow
Archives
- Today
- Total
사진과 음악을 좋아하는 개발자 지망생의 블로그
연결리스트 level 2 (Dummy Head Linked List) 본문
반응형
연결리스트
2) Dummy Head를 가지는 연결 리스트
① Dummy Head 개요
- 연결 리스트는 삽입 및 삭제가 유연하게 이뤄질 수 있다는 장점 있음
- 하지만, 리스트의 길이가 길어질수록 실행 시간이 늘어난다
- 이러한 단점을 보완하기 insertAfter(prev, newNode), popAfter(prev)와 같은 메소드를 만든다
- insertAfter(prev, newNode), popAfter(prev)는 prev가 Head일 시 어떻게 처리해야할 지에 대한 문제가 생김
- 이러한 문제를 해결하기 위해 Dummy Node를 추가하고 Dummy Node를 '0'번으로 정함
class LinkedList :
def __init__(self) :
self.nodeCount = 0
self.head = None
self.tail = None
self.head.next = self.tail
→ Dummy Node가 추가됨에 따라 연결 리스트 연산과 관련된 메소드들도 조금씩 수정이 되어야 함
② 수정된 연결 리스트 연산
1. 특정 원소 참조(k 번째)
def getAt(self, pos):
if pos < 0 or pos > self.nodeCount:
return None
i = 0 # Dummy Node 추가 후 i가 초기값이 1 -> 0 으로 변경
curr = self.head # getAt(00 -> Head
while i < pos:
curr = curr.next
i += 1
return curr
2. 리스트 순회
def traverse(self):
result = []
curr = self.head
while curr.next: # 링크가 살아있는 한 계속해서 쫓아가는 형식
curr = curr.next
result.append(curr.data)
return result
3. 길이 얻어내기
self.nodeCount() # 기존과 동일
4. 원소 삽입
def insertAfter(self, prev, newNode):
newNode.next = prev.next
if prev.next is None: # pos가 nodeCount + 1인 경우
self.tail = newNode
prev.next = newNode
self.nodeCount += 1
return True
def insertAt(self, pos, newNode):
if pos < 1 or pos > self.nodeCount + 1: # pos 범위 조건 확인
return False
if pos != 1 and pos == self.nodeCount + 1: # pos가 nodeCount + 1인 경우 prev -> tail
prev = self.tail
else:
prev = self.getAt(pos - 1)
return self.insertAfter(prev, newNode)
5. 원소 삭제
def popAfter(self, prev):
result = 0
curr = prev.next
if prev.next == self.tail :
prev.next = None
self.tail = prev
else : prev.next = curr.next
result = curr.data
self.nodeCount -= 1
return result
def popAt(self, pos):
if pos < 1 or pos > self.nodeCount :
raise IndexError
prev = self.getAt(pos - 1)
return self.popAfter(prev)
6. 두 리스트 합치기
def concat(self, L):
self.tail.next = L.head.next # L.head는 Dummy node이므로 self.tail.next -> L.head.next
if L.tail:
self.tail = L.tail
self.nodeCount += L.nodeCount
반응형
'CS > 자료구조 & 알고리즘' 카테고리의 다른 글
큐(Queue) level 1 (0) | 2023.04.12 |
---|---|
스택(Stack) (0) | 2023.04.11 |
연결리스트 level 3 (Doubly Linked List) (0) | 2023.04.11 |
연결리스트 level 1 (0) | 2023.04.11 |
배운 내용을 복습하고 기록하는 공간입니다. (0) | 2023.04.10 |