如何在链表中打印返回的类对象?

Posted

技术标签:

【中文标题】如何在链表中打印返回的类对象?【英文标题】:How to print returned class object in linked lists? 【发布时间】:2022-01-06 20:18:54 【问题描述】:

上下文:我试图在 vscode 中模拟 leetcode 的测试用例,因为 leetcode 不提供免费用户可用的调试器。 https://leetcode.com/problems/merge-two-sorted-lists/

这是讨论选项卡中的代码解决方案:

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

    def add_nodes(self, parent, vals):
        while len(vals) > 0:
            node = ListNode(vals[0])
            parent.next = node
            return self.add_nodes(node, vals[1:])


class Solution:
    def mergeTwoLists(self, list1: ListNode, list2: ListNode) -> ListNode:
        l1 = []
        while list1 != None:
            l1.append(list1.val)
            list1 = list1.next
        while list2 != None:
            l1.append(list2.val)
            list2 = list2.next
        l1.sort()
        if l1 == []:
            return None
        new_list = ListNode(l1[0])
        new_list.add_nodes(new_list, l1[1:])
        return new_list

# The code below is what I used inside vscode to simulate leetcode's test case
program = Solution()
list = program.mergeTwoLists(ListNode([1, 3, 4]), ListNode([1, 2, 4]))
print(list.__dict__)

我要完成的工作:我想在 solution 类中打印返回的对象。

我预期会发生什么: 我希望 2 个链表 [1,2,4] [1,3,4] 被合并,打印输出为 [1,1 ,2,3,4,4]

问题:但是,这是我在研究中使用的唯一方法,但它仍然不起作用print(list.__dict__)。打印输出为

'val': [1, 2, 4], 'next': <__main__.ListNode object at 0x0000024D48203460>

【问题讨论】:

正在打印对象。 【参考方案1】:

一些问题:

您的主代码将一个列表传递给ListNode 构造函数,但它会将其解释为一个节点的单个值。相反,您应该调用 add_nodes 方法。

其实用class方法(不是instance方法)从标准列表创建新的链表更有意义

为了打印链表中的值,我喜欢实现__iter__,它也可以用于许多其他目的,然后基于__str__

所以你的班级可能是这样的:

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

    @classmethod
    def fromvalues(Cls, values):
        head = None
        for value in reversed(values):
            head = Cls(value, head)
        return head

    def __iter__(self):
        yield self.val
        if self.next:
            yield from self.next

    def __str__(self):
        return "->".join(map(str, self))

你的主要代码是这样的:

program = Solution()
list = program.mergeTwoLists(ListNode.fromvalues([1, 3, 4]), ListNode.fromvalues([1, 2, 4]))
print(list)

请注意,有更有效的方法可以解决此代码挑战:

首先将结果存储在标准列表中,然后将其转换为链表,这样的内存效率不高。您应该尝试在没有中间标准列表的情况下执行此操作,并立即从输入列表创建最终链表。

您的实现没有使用输入链表已排序的给定事实。这意味着您应该能够在不调用 sort 方法的情况下执行此操作,而是通过始终选择与其他头节点相比具有最小值的头节点来合并列表。然后从它所在的列表中删除该头节点,并将其用于构建结果。您甚至可以就地重新连接节点。

【讨论】:

【参考方案2】:

您可以将__repr__() 方法添加到 ListNode 类。这将允许您简单地打印结果(您不应该调用 list,因为那是 Python 类型名称):

def __repr__(self):
    return f"self.val-->self.next" if self.next else f"self.val"

【讨论】:

以上是关于如何在链表中打印返回的类对象?的主要内容,如果未能解决你的问题,请参考以下文章

装箱拆箱

[LeetCode]138复制带随机指针的链表

从装箱拆箱看泛型

数据结构:单向链表系列5--在链表中查找元素

在链表C ++中搜索Object的某个字段

如何指向链表中的下一个节点并打印该值