我想形成一个链表,它按数字数字的顺序颠倒。例如,如果数字是 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略有不同,因为它没有父节点。我通过创建一个假起点来回避这一点,以便可以统一处理所有数字,然后忽略额外的对象。无论如何,您都在函数中执行所有这些操作,因此垃圾回收器可以处理它。
下面是一个基于字符串反转的解决方案:
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