理解Python的链表ListNode

玛格永利 2024-07-17 10:05:02 阅读 79

一、背景

许多小伙伴在刷题时会涉及到链表排序,但对于只学习Python的小伙伴,对于链表的数据结构不太熟悉,无法有效理解ListNode的定义及使用。读者在进行LeetCode刷题时也懵懵懂懂,今天就在这里彻底搞清楚。

二、目标

理解python版的链表LisNpde定义掌握ListNode的使用方法

三、链表ListNode

1. ListNode类定义

<code>class ListNode:

def __init__(self, x):

self.val = x

self.next = None

说明:上述代码定义了一个名为 ListNode 的类,它是链表中的一个节点的表示。在链表数据结构中,每个节点通常包含两部分:一个存储数据的值(通常是一个整数、字符或其他数据类型),以及一个指向下一个节点的指针。

class ListNode这行定义了一个名为 ListNode 的新def __init__(self, x)这是 ListNode 类的初始化方法(也称为构造函数)。当你创建一个新的 ListNode 对象时,这个方法会被自动调用。它接受两个参数:self 和 xself 是一个对实例本身的引用,而 x 是我们要存储在节点中的值。self.val = x :这行将传入的参数 x 的值赋给 self.val。这意味着每个 ListNode 对象都有一个 val 属性,用于存储节点的值self.next = None:这行初始化 self.next 属性为 Noneself.next 是一个指向下一个 ListNode 对象的指针。在创建新的节点时,我们不知道它的下一个节点是什么,所以我们将它初始化为 None。当我们构建链表时,我们会根据需要更新这个指针。

2. ListNode使用

例:构建一个链表:3->5->6->1

# 创建各个节点

node3 = ListNode(3)

node5 = ListNode(5)

node6 = ListNode(6)

node1 = ListNode(1)

# 构建链表

node3.next = node5

node5.next = node6

node6.next = node1

# 链表构建完成,现在 node3 是链表的头节点

head = node3

# 打印链表以验证

current_node = head

while current_node:

print(current_node.val, end='->') code>

current_node = current_node.next

print('None') # 打印链表的结尾

3. 小试牛刀

题1:使用链表ListNode,将给定的链表排序

def insertion_sort_list(head):

# 如果链表为空或只有一个节点,则无需排序

if not head or not head.next:

return head

# 创建一个哑节点(dummy node)作为新链表的头部

dummy = ListNode(0)

dummy.next = head

current = head

while current and current.next:

# 如果当前节点的值小于下一个节点的值,则无需交换

if current.val <= current.next.val:

current = current.next

continue

# 否则,需要找到正确的位置插入当前节点

prev = dummy

while prev.next and prev.next.val < current.val:

prev = prev.next

# 将当前节点从原链表中移除

next_node = current.next

current.next = next_node.next

# 将当前节点插入到正确的位置

next_node.next = prev.next

prev.next = next_node

# 检查是否还需要对刚刚移动过的节点进行进一步排序

current = prev.next

# 返回排序后的链表

return dummy.next

题2:将两个有序链表合并为一个有序链表(升序)

def mergeTwoLists(l1, l2):

# 创建一个移动点和头节点

curr = dummy = ListNode(0)

# 移动节点,比较两个链表的值大小

while l1 and l2:

if l1.val < l2.val:

curr.next = l1

l1 = l1.next

else:

curr.next = l2

l2 = l2.next

curr = curr.next

# 当其中一个链表移动完时,将另一个链表剩余的节点拼接即可

curr.next = l1 or l2

return dummy.next



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。