我正在努力学习Python,并且正在使用LeetCode进行练习.Problem 1721要求我们编写一个函数,当传递到链表中时,该函数将两两交换相邻 node .例如:

Input : [A, B, C, D, E, F, G]
Output: [B, A, D, C, F, E, G]

我自己想出了一个解决方案,但我不明白下面的另一个解决方案.当作者写pre = self的时候,pre到底是什么?我对关键字self的理解使我相信它指的是Solution类的一个实例,但我不知道这将如何帮助解决问题.难道我们不应该只操纵链表吗?

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution(object):
    def swapPairs(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        pre, pre.next = self, head
        while pre.next and pre.next.next:
            a = pre.next
            b = a.next
            pre.next, b.next, a.next = b, a, b.next
            pre = a
        return self.next

我读过其他几个问题和介绍self的其他网站,但它们都只提供了构造函数和其他微不足道的函数的非常基本的示例.我不明白self.next在这里是什么意思.

这是我在这个论坛上的第一个问题,所以如果我有任何方法可以改进这个问题,请告诉我.提前谢谢您.

推荐答案

这个解决方案以一种相当"有创意"的方式使用self.下面的selfSolution的实例--由LeetCode框架在执行如下代码时创建:

solution = Solution()
head = ListNode(1, ListNode(2, ListNode(3)))
newHead = solution.swapPairs(head)
# ... continue to verify the returned result

以这种方式使用self看起来很奇怪,因为这self不是ListNode实例,也没有next属性.以下语句实际上是selfcreatesnext属性:

pre, pre.next = self, head

因此,循环将愉快地访问这个next属性,而不必知道它实际上不属于ListNode实例.在循环结束后,可以检索next属性以返回最终列表.

这段代码的作者认为(Ab)使用self作为伪 node .create这样的虚拟 node 更常见,如下所示:

class Solution(object):
    def swapPairs(self, head):
        dummy = ListNode()  # The node's value is not relevant -- never used
        pre, pre.next = dummy, head
        while pre.next and pre.next.next:
            a = pre.next
            b = a.next
            pre.next, b.next, a.next = b, a, b.next
            pre = a
        return dummy.next

作者没有创建这个 node ,而是为此重用了LeetCode的解决方案实例,从而节省了一些内存(和一行代码).

我不建议这样做,因为:

  • 它模糊了代码的含义;
  • 它在Solution的第instance位留下了一个参考.这是调用方可能没有意识到的副作用,可能会阻止某些垃圾回收的发生.

Python-3.x相关问答推荐

根据其他数据框架的列顺序从数据框架中进行 Select

安装grpcio时出现错误DeproationWarning:pkg_resource

如何在matplotlib中显示次要刻度标签

从.csv导入将文件夹路径加入到文件名

Pandas 根据条件增加Dataframe列

根据第一个字典的值序列对第二个字典进行排序

没有这样的命令';角色';-可靠分子

使用 Fetch 提交表单到 Django 视图

替换 .txt 文件中的项目列表

在Pandas中,根据另一列中的重复值将数据分组为一列

Python 列表求和所有出现的保留顺序

如何在不使用循环的情况下根据另一个数组的索引值将 numpy 数组中不同通道的值设置为零?

根据另一个数据帧中的位置从主数据帧中提取子序列

Python 3.5 中编码 utf-8 和 utf8 的区别

两个字符串之间的正则表达式匹配?

pysftp vs. Paramiko

如何在 Spyder 控制台中使用变量执行 Python 3.3 脚本?

如何在 Python 中计算 cohen 的 d?

从大字典中弹出 N 项的最快方法

对字节进行按位运算