'''
當加入第一個node節點的時候,會有幾個值,(這裏的self.tail.next 其實就是node.next)
head = item = tail = Node(object element1 memory)
item = head = tail = Node(object element1 memory)
next = None
tail = item = head = Node(object element1 memory)
當加入第二個元素node節點的時候,next1值會改變,tail會向後漂移,head將會保留
新加入第二個元素後第一個節點變成了
head = item1 = Node(object element1 memory)
item1= head = Node(object element1 memory)
next = Node(object element2 memory)
第二個節點爲:
item = tail = Node(object element2 memory)
next = Node(object element2 memory)
tail = item = Node(object element2 memory)
當加入第三個元素的時候,tail.next繼續爲None item爲新元素tail結束元素爲新元素,
item = tail = Node(object element3 memory)
next = None
tail = item = Node(object element3 memory)
'''
class Node:
def __init__(self,item,next=None):
self.item = item #記錄元素
self.next = next #記錄下一跳節點
#爲了輸出 我們可以看到的結果:
def __repr__(self):
return '{} ==> {}'.format(self.item,self.next)
class LinkedList:
def __init__(self):
self.head= None
self.tail = None
def append(self,value):
#添加鏈表前需要,實例化一個節點,來進行賦值
node = Node(value) #實例化節點
#添加鏈表,首先判斷鏈表是否爲空,
# 空列表時 head= tail = None
#添加元素後head = value = tail = Node(value) = node
if self.head == None:
self.head = node
# self.tail = node
#當鏈表不爲空時向後添加,既是向後添加,添加後的值爲
# self.tail.next = Node(last(value)).next = node
#要知道self.tail值的改變是不應爲append的改變而改變了,只是再重新賦值之後纔會改變的
# self.tail = node #現在的結尾部分被重新賦值
else:
self.tail.next = node #如果添加的是最後一位,next就是默認值既是None
# self.tail = node
# if和slse有公共部分self.tail = node可以直接提出來,
self.tail = node
def iternode(self):
#這裏的迭代可以使用我們定義好的方法來做,因爲每個node節點都有next可以調用下一個節點,因此我們可以利用這一特性來做迭代
#因爲我們不知道需要迭代的個數有多少個,因此只能使用yield配合while循環來做,然後使用節點的下一個來重賦值,知道current爲None,while循環結束
current = self.head
while current:
yield current
current = current.next
ll = LinkedList()
ll.append(1)
ll.append(2)
ll.append(3)
for i in ll.iternode():
print(i)
輸出結果爲:
1 ==> 2 ==> 3 ==> None
2 ==> 3 ==> None
3 ==> None