了解注意點:
1. 要了解可變類型 不可變類型
2. 要區分 a=Node('aa') a是變量名,後面是記憶體位址 print(a) <__main__.Node at 0x10e815a10>,
c = Node(1,Node(1,Node(1,Node(1))))
尾巴節點的next指向None 這個記憶體位址,其他節點依次指向下一個節點的記憶體位址
=号後面都是記憶體位址,隻不過print(a) 的時候,把值展示出來(通過了解__repr__可以了解)
摘抄下文中的代碼,=後面都是記憶體位址:
curr.next = new_head
new_head = curr # new_head 指向,這個curr 是一個記憶體位址,下一行 curr是一個變量名,指向tmp這個記憶體位址
curr = tmp
# 我們思維認知中,數學中:
# 集合 a = {1,2,3}
# 集合 b = a
# 如果給b集合增加一個元素 b = {1,2,3,4}
# 此時 a 仍然是{1,2,3}
# 與此相反,代碼中 可變類型 b改變 a 也會改變
class Node(object):
def __init__(self, data, next=None):
self.data = data
self.next = next
a = Node('a',"此處是記憶體位址")
b = a
b.data = 'bb'
print(a.data)
# 'bb'
定義節點
class Node(object):
def __init__(self, data, next=None):
self.data = data
self.next = next
def __repr__(self):
# 為了學習可以不要這行,更容易了解記憶體位址
return str(self.data)
# 注意 node2 和node1 為同一個記憶體的資料,改變任意一個,另外一個也改變
node1 = Node('abc')
node2 = node1
node2.next='aaaaaa'
node1.next
# 'aaaaaa'
連結清單反轉
class Link(object):
def __init__(self, head=None):
self.head = head
def append(self, dataOrNode):
item = None
if isinstance(dataOrNode, Node):
item = dataOrNode
else:
item = Node(dataOrNode)
if not self.head:
self.head = item
else:
node = self.head
while node.next:
node = node.next
node.next = item
def reverse(self, head):
new_head = head
curr = head.next
new_head.next = None
# 原先寫法 這樣會出錯,因為new_head 和head是同一個記憶體,new_head.next = None 把head也修改了,可以使用deepcopy
# new_head = head
# new_head.next = None
# curr = head.next
# =============
# deepcopy 寫法 以下可以正常使用
# from copy import deepcopy
# new_head = deepcopy(head)
# new_head.next = None
# curr = head.next
while curr:
tmp = curr.next
curr.next = new_head
new_head = curr # new_head 指向,這個curr 是一個記憶體位址,下一行 curr是一個變量名,指向tmp這個記憶體位址
curr = tmp
return new_head
my_link = Link()
for i in range(10):
my_link.append(i)
new_head = my_link.reverse(my_link.head)
while new_head:
print(new_head.data)
new_head = new_head.next