【问题标题】:Python linked list: Connect head with linked list nodePython链表:用链表节点连接头
【发布时间】:2017-06-13 17:37:42
【问题描述】:

我正在尝试将数字转换为链表(例如 617 到 7->1->6)

这是我的代码:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    # @param l1: the first list
    # @param l2: the second list
    # @return: the sum list of l1 and l2 
        def addLists(self, l1, l2):
            # write your code here
            num_1 = num_2 = 0
            counter = 1

            # convert each linked list to an integer
            while l1 != None:
                num_1 += l1.val * counter
                l1 = l1.next
                counter *= 10

            # reset counter
            counter = 1
            while l2 != None:
                num_2 += l2.val * counter
                l2 = l2.next
                counter *= 10

            # perform the addition        
            my_sum = num_1 + num_2

            # convert the sum back to a linked list
            # initialize head
            sum_head = ListNode(my_sum % 10)
            sum_node = sum_head
            my_sum //= 10

            while my_sum != 0:
                sum_node.next = ListNode(my_sum % 10)
                sum_node = sum_node.next
                my_sum //= 10

            # return the the linked list
            return sum_head

我对这部分进行了编码,并且这段代码有效。我只是不明白为什么“sum_head”能够链接到第二个节点“sum_node”。

以下是 Python 中的示例:

a = <Object>
b = a

b 只是对 a 的引用,这样对吗?

说将 617 转换为 7->1->6。按照我的代码,头部是 7,链表的其余部分是 7->1->6。头部怎么知道下一个节点是1?

【问题讨论】:

  • 不,b 不是对a 的引用。它们都是同一个对象的名称。

标签: python algorithm linked-list


【解决方案1】:

前两个变量不是链表意义上的“链接”。它们是同一个对象。如果将其替换为等效表达式,这可能会更清楚:

sum_head = ListNode(my_sum % 10)
sum_node = sum_head

# ==

sum_node = sum_head = ListNode(my_sum % 10)

# So: sum_node.next is sum_head.next

为什么我们需要两个变量指向同一个对象?因为在以下几行中,我们更改了 sum_node 指向的内容。它将成为以前的对象的.next。由于无法返回,所以我们需要保留头部的引用才能返回。

【讨论】:

  • 非常感谢您的回答!我确实有一个后续问题:a = b = 和 a = b = 之间有什么区别吗?因为我尝试过:a = b = 10,所以它不起作用,因为它是 a = b = ListNode(...)
  • @Terence a = b = 10 工作方式相同,但整数是不可变的。因此,当您稍后执行b += 1 时,将为11 创建一个新的整数对象并将其分配给b。这就解释了为什么a 没有更新,因为它仍然引用值为10 的原始整数对象。简而言之,a = b = xx 分配给ab,但除了引用同一个对象之外,没有任何内在关联ab。在 Python 中,最常见的不可变类型是 intstrtupleset
  • 谢谢@JaredGoguen,你很有帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-15
  • 2011-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-23
相关资源
最近更新 更多