理解Python的链表ListNode

一、背景

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

二、目标

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

三、链表ListNode

1. ListNode类定义

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

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

  1. class ListNode这行定义了一个名为 ListNode 的新
  2. def __init__(self, x)这是 ListNode 类的初始化方法(也称为构造函数)。当你创建一个新的 ListNode 对象时,这个方法会被自动调用。它接受两个参数:self 和 xself 是一个对实例本身的引用,而 x 是我们要存储在节点中的值。
  3. self.val = x :这行将传入的参数 x 的值赋给 self.val。这意味着每个 ListNode 对象都有一个 val 属性,用于存储节点的值
  4. 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='->')  
    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

  • 9
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值