데이터 구조 및 분석 ch_3_4 Linked List II
Jul 16, 2021
»
writing
KAIST 산업및시스템공학과 문일철_ 데이터 구조 및 분석 수업을 참고하여 작성하였습니다
ch_3_4 Linked List II
Linked List II
1. Head and Tail
: Specialized node
- Head : Always at the first of the list
- Tail : Always at the last of the list
- two corner stone showing the start and the end of the list
: optional node
- Linked list works okay without these
- But, having these makes implementation very convenient
2. Search precedure in singly linked list
: just like an array, navigating from the first to the last until hit is the only way
: No difference in the search pattern, though you can't use index any further!!!
: Your list implementation may include the index funtion, but isn't required in the linked list
1) Head from list
2) detect next node
if next == tail : break
if next != tail : next.object= '~~'
3. Insert procedure in singly linked list
: you see the power of a linked list
: you need N retrievals to insert a value in the array list
: you need only three operations
1) with an assumption that you have a reference to the node(pre)
that you want to put your new node next
2) you store a node(next), pointed by a reference
from node(pre)'s nodeNext member variable
3) you change a reference from node(pre)'s
nodeNext to node(new)
4) you change a reference from node(new)'s nodeNext to node(new)
: Over-written with a new reference to the new node
4. Delete procedure in singly linked list
: the another moment that you see the power of a linked list
: you need N retrievals to delete a value in the array list
: you need only three operation
1) with an assumption that you have a reference to node,(pre) that you
want to remove the node next
1) you retreive node(next) that is two step next from node(next)
2) you change a reference from node(pre)'s nodeNext to node(next)
: The node will be remeoved, becuase is no reference to node(remove)
: Over-written with a new reference to the next node of the removed one
class Node :
nodeNext = ''
objValue = ''
binHead = False
binTail = False
def __init__(self, objValue = '', nodeNext = '',binHead = False, binTail = False):
self.nodeNext = nodeNext
self.objValue = objValue
self.binHead = binHead
self.binTail = binTail
def getValue(self):
return self.objValue
def setValue(self, objValue):
self.objValue = objValue
def getNext(self):
return self.nodeNext
def setNext(self, nodeNext):
self.nodeNext = nodeNext
def isHead(self):
return self.binHead
def isTail(self):
return self.binTail
node1 = Node(objValue='a')
nodeTail = Node(binTail = True)
nodeHead = Node(binHead = True, nodeNext = node1)
class SinglyLinkedList:
nodeNew = ''
nodePrev = ''
size = 0
def __init__(self): # Constructor
self.nodeTail = Node(binTail = True)
self.nodeHead = Node(binHead= True, nodeNext= self.nodeTail)
def insertAt(self, objInsert, idexInsert):
nodeNew = Node(objValue=objInsert)
nodePrev = self.get(idexInsert - 1)
nodeNext = nodePrev.getNext()
nodePrev.setNext(nodeNew) # nodePrev -> nodeNew
nodeNew.setNext(nodeNext) # nodeNEW -> nodeNext
self.size = self.size + 1
def removeAt(self, idxRemove):
nodePrev = self.get(idxRemove -1)
nodeRemove = nodePrev.getNext()
nodeNext = nodeRemove.getNext()
nodePrev.setNext(nodeNext)
self.size= self.size -1
return nodeRemove.getValue()
def get(self, idxRetrieve):
nodeReturn = self.nodeHead
for itr in range(idxRetrieve +1):
nodeReturn = nodeReturn.getNext()
return nodeReturn
def printStatus(self):
nodeCurrent = self.nodeHead
while nodeCurrent.getNext().isTail() ==False:
nodeCurrent = nodeCurrent.getNext()
print(nodeCurrent.getNext())
print()
def getSize(self):
return self.size