Python 在迭代数字时,如何形成链表?

Python 在迭代数字时,如何形成链表?,python,linked-list,Python,Linked List,我想形成一个按数字顺序颠倒的链表。例如,如果数字是523,链表将是3->2->5 我试着迭代这个数字并形成一个列表,但我无法推断如何在O(n)中形成一个链表?! 我当前的代码库卡在这里: def form_linked_list(self, number): final_list = ListNode(number%10) number = int(number/10) while(number): final_list.next = ListNode(n

我想形成一个按数字顺序颠倒的链表。例如,如果数字是523,链表将是3->2->5

我试着迭代这个数字并形成一个列表,但我无法推断如何在O(n)中形成一个链表?! 我当前的代码库卡在这里:

def form_linked_list(self, number):
    final_list = ListNode(number%10)
    number = int(number/10)
    while(number):
        final_list.next = ListNode(number%10)
        number = int(number/10)
    return final_list

我希望以相反的顺序从给定的数字形成一个链表。我无法推断出这样做的逻辑。

当我研究数字问题时,我喜欢将数字提取与我最终使用数字所做的任何事情分离

def digits(n):
  # requires n >= 0, counts 0 as having no digits
  while n:
    yield n%10
    n //= 10

head = cur = ListNode(0)  # not part of the final list
for x in digits(number):
  cur.next = ListNode(x)
  cur = cur.next
head = head.next

当您在数字上迭代时,您需要处理第一个ListNode(如果存在)的创建,它与其他ListNodes略有不同,因为它没有父节点。我通过创建一个伪起点来回避这个问题,这样所有的数字都可以统一处理,然后忽略额外的对象。无论如何,您都是在一个函数中完成这一切的,所以垃圾收集器可以处理它。

当我处理数字问题时,我喜欢将数字提取与我最终使用数字所做的任何事情分离

def digits(n):
  # requires n >= 0, counts 0 as having no digits
  while n:
    yield n%10
    n //= 10

head = cur = ListNode(0)  # not part of the final list
for x in digits(number):
  cur.next = ListNode(x)
  cur = cur.next
head = head.next

当您在数字上迭代时,您需要处理第一个ListNode(如果存在)的创建,它与其他ListNodes略有不同,因为它没有父节点。我通过创建一个伪起点来回避这个问题,这样所有的数字都可以统一处理,然后忽略额外的对象。无论如何,您都是在一个函数中完成这一切的,因此垃圾收集器可以处理它。

这里有一个基于字符串反转的解决方案:

class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

def form_linked_list(number):
    number_str = str(number)[::-1]

    if number_str:
        head = ListNode(number_str[0])
    for idx in range(1,len(number_str)):
        if idx == 1:
            head.next = ListNode(int(number_str[idx]))
            temp = head.next
        else:
            temp.next = ListNode(int(number_str[idx]))
            temp = temp.next

    return head

if __name__ == '__main__':
    result =form_linked_list(523)
    while(result):
        print(result.val)
        result = result.next

输出为:

1
3
2

下面是一个基于字符串反转的解决方案:

class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

def form_linked_list(number):
    number_str = str(number)[::-1]

    if number_str:
        head = ListNode(number_str[0])
    for idx in range(1,len(number_str)):
        if idx == 1:
            head.next = ListNode(int(number_str[idx]))
            temp = head.next
        else:
            temp.next = ListNode(int(number_str[idx]))
            temp = temp.next

    return head

if __name__ == '__main__':
    result =form_linked_list(523)
    while(result):
        print(result.val)
        result = result.next

输出为:

1
3
2

谢谢你,汉斯!你能告诉我为什么
curr
中的更改也会导致
head
中的更改吗?当然。这里的关键概念是变量和对象。开始时,
head
cur
是指向同一对象的不同变量。当您分配
cur.next=ListNode(x)
时,这与至少第一次说
head.next=ListNode(x)
完全相同。我们要做的下一件事是重新分配变量
cur
以指向对象
cur.next
,因此当我们写入
cur.next=ListNode(x)
时发生的下一个赋值基本上与
head.next.next=ListNode(x)
相同。等等,用头。下一个。下一个。下一个等等。谢谢汉斯!你能告诉我为什么
curr
中的更改也会导致
head
中的更改吗?当然。这里的关键概念是变量和对象。开始时,
head
cur
是指向同一对象的不同变量。当您分配
cur.next=ListNode(x)
时,这与至少第一次说
head.next=ListNode(x)
完全相同。我们要做的下一件事是重新分配变量
cur
以指向对象
cur.next
,因此当我们写入
cur.next=ListNode(x)
时发生的下一个赋值基本上与
head.next.next=ListNode(x)
相同。以此类推,使用头、下一个、下一个、下一个等等。