classNode:"""The nodes of double linked list"""def__init__(self, item):self.prev =Noneself.item = itemself.next=NoneclassDoubleLinkedList:def__init__(self):self.head =Noneif __name__ =="__main__":DLL = DoubleLinkedList()DLL.head = Node(2)DLL.head.next= Node(1)DLL.head.next.prev = DLL.headprint(DLL.head.item)# Point to the second Nodeprint(DLL.head.next.item)# Point to the headprint(DLL.head.next.prev.item)print(DLL.head.next.next)
classNode:"""The nodes of double linked list"""def__init__(self, item):self.prev =Noneself.item = itemself.next=None
重寫正向遍歷方法:(不記得的同學可以參考兩個示例:重寫遍歷方法示例)
classForwardIterator:"""Define a forward-direction iterator"""def__init__(self, node):self.head = node.headself.cur = self.headdef__iter__(self):return selfdef__next__(self):"""Return the next item's value of iterator"""try:self.temp = self.curself.cur = self.cur.nextreturn self.temp.itemexcept AttributeError as e:raise StopIteration
重寫反向遍歷方法:(跟正序遍歷差不多,只是指針的名字不同)
classReversalIterator:"""Define a reverse-direction iterator"""def__init__(self, tail):self.cur = taildef__iter__(self):return selfdef__next__(self):"""Return the next item's value of iterator"""try:self.temp = self.curself.cur = self.cur.prevreturn self.temp.itemexcept AttributeError as e:raise StopIteration
功能實現(xiàn)
classDoubleLinkedList:def__init__(self):"""Initialize the head and the length of double linked list"""self.head =Noneself.len=0defis_empty(self):"""Judge if a linked list is empty"""return self.head isNonedefshow_items(self):"""Show all the elements of linked list"""if self.is_empty():returnNonecur = self.headwhile cur.next:yield cur.itemcur = cur.nextyield cur.itemdefget_value_by_index(self, index):"""Get a value by index"""cur = self.headindex = self.len+ index if index <0else indexif index <0:raise IndexError('index out of range')try:for i inrange(index):cur = cur.nextreturn cur.itemexcept AttributeError as e:raise IndexError('index out of range')# def length(self):# """Return the elements number of a linked list"""# return self.lendefinsert_before(self, index, item):"""Insert an element before the given index of a node"""node = Node(item)cur = self.headifnot cur:self.head = nodeelse:if-self.len< index <0:index += self.lenprint(index)if index >0:# 0 < index or 0 < (index + self.len)while cur.next:index -=1if index <=0:breakcur = cur.nextif cur.next:node.next= cur.nextcur.next.prev = nodecur.next= nodenode.prev = curelse:# node.next = cur.next # Not necessarycur.next= nodenode.prev = curelif index <=-self.lenor index ==0:# index < -self.len or index == 0node.next= self.headself.head.prev = nodeself.head = nodeself.len+=1definsert_after(self, index, item):"""Insert an element after the given index of a node"""if index >=0:self.insert_before(index+1, item)elif-self.len-1<= index <0:# insert_before(self.len+index+1) equals to insert_after(index)self.insert_before(self.len+index+1, item)else:self.insert_before(0, item)# Use insert_before(), so as to no self.len+=1defappend(self, item):"""Append an element to the end of a linked list"""node = Node(item)if self.is_empty():self.head = nodeelse:cur = self.headwhile cur.next:cur = cur.next# node.next = cur.next # Not necessarycur.next= nodenode.prev = curself.len+=1deftraverse_forward(self):"""Travel from the head and return the node one by one"""return ForwardIterator(self)deftraverse_backward(self):"""Travel from the tail and return the node one by one"""cur = self.headwhile cur.next:cur = cur.nextreturn ReversalIterator(cur)defremove(self, index):"""Remove an element by index"""ifnot-self.len-1< index < self.len:raise IndexError('remove index out of range')if index <0:index += self.lenif index ==0:self.head = self.head.nextelse:cur = self.headpre = curwhile index >0:pre = curcur = cur.nextindex -=1pre.next= cur.nextself.len-=1defis_exist(self, item):"""Judge if an element in linked list"""return item in self.show_items()defindexOf(self, item):"""Find the first-appears-index of Node(item)"""returnlist(self.show_items()).index(item)defclear(self):"""CLear all nodes"""self.head =Noneself.len=0defreverse(self):"""Reverse the linked list"""cur = self.headifnot cur:returndefreverse(cur):ifnot cur.next:self.head = curreturn curprev = reverse(cur.next)prev.next= curcur.next=Nonereturn curreverse(cur)
驗證功能
if __name__ =='__main__':DLL = DoubleLinkedList()print(f"Is empty? {DLL.is_empty()}")for i inrange(5):DLL.append(i)print(f"Show all items:{list(DLL.show_items())}")_index, _item =-6,11DLL.insert_before(_index, _item)print(f"Insert {_item} before linked list[{_index}]: {list(DLL.show_items())}")_index, _item =-3,22DLL.insert_after(_index, _item)print(f"Insert {_item} after linked list[{_index}]: {list(DLL.show_items())}")_item =33DLL.append(_item)print(f"Append an element[{_item}] to the end: {list(DLL.show_items())}")import collections# Travel backwardprint("DLL.traverse_backward() is Iterable??",isinstance(DLL.traverse_backward(), collections.Iterable))print([i for i initer(DLL.traverse_backward())])# for i in DLL.traverse_forward():# print(i)# Travel forwardprint("DLL.traverse_forward() is Iterable??",isinstance(DLL.traverse_forward(), collections.Iterable))print([i for i initer(DLL.traverse_forward())])# for i in DLL.traverse_forward():# print(i)_index =-1DLL.remove(_index)print(f"Remove an element by index[{_index}]: {list(DLL.show_items())}")_item =22print(f"Is item [{_item}] exists in this list? {DLL.is_exist(_item)}")_item =1print(f"The first-appears-index of item [{_item}] in this list is {DLL.indexOf(_item)}")print(f"Clear all: {DLL.clear()}, the length of the list: {DLL.len} ")for i inrange(3):DLL.append(i)print(f"Before reverse: {list(DLL.show_items())}")DLL.reverse()print(f"After reverse: {list(DLL.show_items())}")
輸出結果:
Is empty? True
Show all items:[0,1,2,3,4]
Insert 11 before linked list[-5]:[11,0,1,2,3,4]
Insert 22 after linked list[5]:[11,0,1,2,3,4,22]
Append an element[33] to the end:[11,0,1,2,3,4,22,33]
DLL.traverse_backward()is Iterable?? True[33,22,4,3,2,1,0,11]
DLL.traverse_forward()is Iterable?? True[11,0,1,2,3,4,22,33]
Remove an element by index[-1]:[11,0,1,2,3,4,22]
Is item [22] exists in this list? True
The first-appears-index of item [1]in this listis2[11,0,1,55,2,3,4,22]
Clear all:None, the length of the list:0
Before reverse:[0,1,2]
After reverse:[2,1,0]
import collectionsclassMyIter(object):def__init__(self, num):self.num = numdef__next__(self):if self.num ==0:raise StopIterationself.num -=1return self.numdef__iter__(self):return selffor i in MyIter(4):print(i)print(iter(MyIter(4)))print(isinstance(MyIter(4), collections.Iterable))
Example2
# Example2classIteration:def__init__(self, iterable):# [1, 2, 3, 4]self.iterable = iterableself.stop =len(iterable)self.start =0def__iter__(self):return selfdef__next__(self):"""Return the next item's value of iterator"""if self.start < self.stop:start = self.startself.start +=1return self.iterable[start]else:raise StopIterationdefadd(self, item):self.iterable.append(item)alist =[1,2,3,4]
IT = Iteration(alist)print(f"[{IT.__class__.__name__}] is iterable? {isinstance(IT, collections.Iterable)}")print(f"[{IT.__class__.__name__}] is iterable? {iter(IT)}")for i in IT:print(i)