理解注意点:
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