- Today
- Total
Recent Posts
Recent Comments
Archives
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 알고리즘 강좌
- python 중간고사
- 면접 파이썬
- 자료구조
- 파이썬3
- 기말시험
- 자료구조 강의
- 파이썬
- 파이썬 강의
- 채용문제
- 쉬운 파이썬
- 알고리즘 강의
- gdrive
- 크롤링
- c언어
- 파이썬활용
- 코딩시험
- 파이썬 강좌
- 프로그래밍
- python data structure
- selenium
- 알고리즘
- 대학시험
- 파이썬 알고리즘
- Crawling
- 중간시험
- 파이썬 입문
- 셀레니움
- 파이썬 자료구조
- 코딩문제
Notice
반원 블로그
02c. 이중 연결 리스트(doubly linked list) - ii. 삽입 본문
삽입
이중 연결리스트의 삽입 방법은 2가지입니다. 단일 연결 리스트처럼 head로 넣는 방법과 같은 방법으로 tail을 통해 넣는 방법.
각 상황에 따라 노드의 next와 prev값을 다음노드와 이전노드로 지정해주면 됩니다.
저장된 노드가 없는 경우(head,tail)
아무런 노드도 없는 경우는 head와 tail 값이 None입니다. 따라서 head를 통해 넣든, tail을 통해 넣든 결과가 같습니다.
코드 구현
#이중 링크드 리스트
class DLinkedList:
#D_L_list에서 쓸 노드
class Node:
def __init__(self, v, n = None, p = None):
self.value = v #저장된 데이터
self.next = n #다음 노드 가리키는 변수
self.prev = p #이전 노드 가리키는 변수
#D_L_List에서 필요한 변수
def __init__(self):
self.head = None #첫 생성시 내부에는 노드가 없으므로
self.tail = None
#head로 삽입. v : 데이터
def insertNodeBefore(self, v):
#없을 경우
if self.head is None:
self.head = self.Node(v)
self.tail = self.head #같은 노드를 가리킴
#tail로 삽입. v : 데이터
def insertNodeAfter(self, v):
#없을 경우
if self.tail is None:
self.tail = self.Node(v)
self.head = self.tail #같은 노드를 가리킴
##테스트
if __name__=="__main__":
dl = DLinkedList()
# dl.insertNodeAfter('FirstData') #head삽입 테스트
dl.insertNodeBefore('LastData') #tail삽입 테스트
저장된 노드가 있는 경우(head)
새로운 노드만 신경쓰면 좋겠지만, 기존에 head를 차지하던 노드도 신경써야합니다. 왜냐하면 기존에 있던 노드의 prev를 새로 만드는 노드를 가리키도록 해야합니다.
따라서 다음 수행절차를 진행하겠습니다.
- 현재 head가 가리키는 기존 노드의 prev를 새로 생성하는 노드로 지정
- 새로 생성한 노드의 next를 기존 노드로 지정
- head를 새로 생성한 노드로 변경
코드 구현
#이중 링크드 리스트
class DLinkedList:
#D_L_list에서 쓸 노드
class Node:
def __init__(self, v, n = None, p = None):
self.value = v #저장된 데이터
self.next = n #다음 노드 가리키는 변수
self.prev = p #이전 노드 가리키는 변수
#D_L_List에서 필요한 변수
def __init__(self):
self.head = None #첫 생성시 내부에는 노드가 없으므로
self.tail = None
#head로 삽입. v : 데이터
def insertNodeBefore(self, v):
#없을 경우
if self.head is None:
self.head = self.Node(v)
self.tail = self.head #같은 노드를 가리킴
else:
#self.head : 기존노드, self.head.prev : 기존노드의 prev
self.head.prev = self.Node(v,n=self.head) #1,2번을 동시수행
#self.head.prev : 기존노드의 prev == 새로운 노드
self.head = self.head.prev #3. head를 새로운 노드로 변경
##테스트
if __name__=="__main__":
dl = DLinkedList()
dl.insertNodeBefore('1st') # head삽입 테스트
dl.insertNodeBefore('2nd') # head삽입 테스트
dl.insertNodeBefore('3rd') # head삽입 테스트
저장된 노드가 있는 경우(tail)
head와 유사한 점이 많습니다. 단지 head가 tail로, prev를 next로, next를 prev로 바꿔서 생각하면 됩니다.
따라서 다음 수행절차를 진행하겠습니다.
- 현재 tail가 가리키는 기존 노드의 next를 새로 생성하는 노드로 지정
- 새로 생성한 노드의 prev를 기존 노드로 지정
- tail를 새로 생성한 노드로 변경
#이중 링크드 리스트
class DLinkedList:
#D_L_list에서 쓸 노드
class Node:
def __init__(self, v, n = None, p = None):
self.value = v #저장된 데이터
self.next = n #다음 노드 가리키는 변수
self.prev = p #이전 노드 가리키는 변수
#D_L_List에서 필요한 변수
def __init__(self):
self.head = None #첫 생성시 내부에는 노드가 없으므로
self.tail = None
#head로 삽입. v : 데이터
def insertNodeBefore(self, v):
#없을 경우
if self.head is None:
self.head = self.Node(v)
self.tail = self.head #같은 노드를 가리킴
else:
#self.head : 기존노드, self.head.prev : 기존노드의 prev
self.head.prev = self.Node(v,n=self.head) #1,2번을 동시수행
#self.head.prev : 기존노드의 prev == 새로운 노드
self.head = self.head.prev #3. head를 새로운 노드로 변경
#tail로 삽입. v : 데이터
def insertNodeAfter(self, v):
#없을 경우
if self.tail is None:
self.tail = self.Node(v)
self.head = self.tail #같은 노드를 가리킴
else:
#self.tail : 기존노드, self.tail.next : 기존 노드의 next
self.tail.next = self.Node(v,p=self.tail) #1,2번을 동시수행
#self.tail.next : 기존노드의 next == 새로운 노드
self.tail = self.tail.next #3. tail를 새로운 노드로 변경
##테스트
if __name__=="__main__":
dl = DLinkedList()
dl.insertNodeBefore('1st') # head삽입 테스트
dl.insertNodeBefore('2nd') # head삽입 테스트
dl.insertNodeBefore('3rd') # head삽입 테스트
dl.insertNodeAfter('B1st') # tail삽입 테스트
dl.insertNodeAfter('B2nd') # tail삽입 테스트
dl.insertNodeAfter('B3rd') # tail삽입 테스트
위키독스 연재 : https://wikidocs.net/book/2868
'2018~ > 파이썬 자료구조 알고리즘' 카테고리의 다른 글
03a.자료구조와 알고리즘 (0) | 2019.05.07 |
---|---|
02c. 이중 연결 리스트(doubly linked list) - v. 탐색 (0) | 2019.05.06 |
02c. 이중 연결 리스트(doubly linked list) - iv. 삭제 (0) | 2019.05.05 |
02c. 이중 연결 리스트(doubly linked list) - iii. 출력 (0) | 2019.05.04 |
02c. 이중 연결 리스트(Doubly linked list) - i. 구조 (0) | 2019.05.02 |
02b. 단일 연결 리스트(singly linked list) - v. 탐색 (0) | 2019.05.01 |
02b. 단일 연결 리스트(singly linked list) - iv. 삭제 (0) | 2019.04.30 |
02b. 단일 연결 리스트(singly linked list) - iii. 출력 (0) | 2019.04.29 |
Comments