天天看点

python 链表反转

理解注意点:

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