用 Python 对链表进行操作

学数据结构时,一直用 C 语言,C 语言中有指针,实现链表很方便,对链表进行操作只需要修改指针的指向即可。但是最近用 Python 刷 LeetCode 题,发现 Python 没有指针这个概念,刚开始确实不太适应,吃了不少苦头。好在查阅了大量的资料,理解了如何用 Python 对链表进行操作。

 

因为 Python 是动态语言,不需要进行变量声明,可以直接把对象赋值给变量。 Python 对链表进行操作,使用「引用 + 对象」的概念。

 

举个例子,用 LeetCode 第 24 题 Swap Nodes in Pairs。这道题为交换单链表中相邻的两个结点的顺序,给你一个 1->2->3->4,你应该得到 2->1->4->3,具体实现代码如下:

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


class Solution:
    def swapPairs(self, head: ListNode) -> 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

这一行代码很关键:

pre, pre.next = self, head

变量 pre 引用了 self 对象,现在这个对象为类 Solution,类被实例化后,self 就变成了实例。pre.next 就是让对象 self 拥有了一个变量,现在被赋值为 head。经过循环之后,这个变量永远保存链表中第一个结点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值