Python中链接列表分区节点值的更改

时间:2018-07-22 22:21:48

标签: python linked-list

我正在尝试解决CTCI书中的链接列表分区的问题,当我查看here中的python解决方案时,不确定是否完全理解这里的行为。

def partition(head, pivot):
   a_head, a_tail = None, None
   b_head, b_tail = None, None
   node = head
   while node:
       if node.data < pivot:
           if a_head:
               a_tail.next, a_tail = node, node
           else:
               a_head, a_tail = node, node
       else:
           if b_head:
               b_tail.next, b_tail = node, node
           else:
               b_head, b_tail = node, node
       node = node.next
   a_tail.next = b_head
   return a_head

 class Node():
     def __init__(self, data, next=None):
         self.data, self.next = data, next

     def __str__(self):
         string = str(self.data)
         if self.next:
             string += ',' + str(self.next)
         return string

class Test(unittest.TestCase):
    def test_partition(self):
        head1 = 
         Node(7,Node(2,Node(9,Node(1,Node(6,Node(3,Node(8)))))))
        head2 = partition(head1, 6)
        self.assertEqual(str(head2), "2,1,3,7,9,6,8")
        head3 = partition(head2, 7)
        self.assertEqual(str(head3), "2,1,3,6,7,9,8")

if __name__ == "__main__":
  unittest.main()

如果return a_head的值是node时,在else语句的第一次命中只分配了None值,为什么最后要a_head呢?我在整个过程中打印了a_tail.next = head的值,当a_tail.next = head时似乎改变了值。

我不明白为什么会这样。我假设设置a_tail仅适用于a_head,所以不确定为什么它也会更改curl -o /dev/null -s -w "%{http_code}\n" http://localhost:8080/api/health 的值。

1 个答案:

答案 0 :(得分:1)

之后

a_head, a_tail = node, node

a_heada_tail都是对同一对象的引用。所以以后,当您这样做

a_tail.next, a_tail = node, node

这也是第一次设置a_head.next,因为此时a_heada_tail是同一对象。