天天看點

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