Python 在迭代数字时,如何形成链表?
我想形成一个按数字顺序颠倒的链表。例如,如果数字是523,链表将是3->2->5 我试着迭代这个数字并形成一个列表,但我无法推断如何在O(n)中形成一个链表?! 我当前的代码库卡在这里: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
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)
相同。以此类推,使用头、下一个、下一个、下一个等等。