当前位置:   article > 正文

理解Python的链表ListNode_python listnode

python listnode

一、背景

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

二、目标

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

三、链表ListNode

1. ListNode类定义

  1. class ListNode:
  2. def __init__(self, x):
  3. self.val = x
  4. 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

  1. # 创建各个节点
  2. node3 = ListNode(3)
  3. node5 = ListNode(5)
  4. node6 = ListNode(6)
  5. node1 = ListNode(1)
  6. # 构建链表
  7. node3.next = node5
  8. node5.next = node6
  9. node6.next = node1
  10. # 链表构建完成,现在 node3 是链表的头节点
  11. head = node3
  12. # 打印链表以验证
  13. current_node = head
  14. while current_node:
  15. print(current_node.val, end='->')
  16. current_node = current_node.next
  17. print('None') # 打印链表的结尾

3. 小试牛刀

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

  1. def insertion_sort_list(head):
  2. # 如果链表为空或只有一个节点,则无需排序
  3. if not head or not head.next:
  4. return head
  5. # 创建一个哑节点(dummy node)作为新链表的头部
  6. dummy = ListNode(0)
  7. dummy.next = head
  8. current = head
  9. while current and current.next:
  10. # 如果当前节点的值小于下一个节点的值,则无需交换
  11. if current.val <= current.next.val:
  12. current = current.next
  13. continue
  14. # 否则,需要找到正确的位置插入当前节点
  15. prev = dummy
  16. while prev.next and prev.next.val < current.val:
  17. prev = prev.next
  18. # 将当前节点从原链表中移除
  19. next_node = current.next
  20. current.next = next_node.next
  21. # 将当前节点插入到正确的位置
  22. next_node.next = prev.next
  23. prev.next = next_node
  24. # 检查是否还需要对刚刚移动过的节点进行进一步排序
  25. current = prev.next
  26. # 返回排序后的链表
  27. return dummy.next
'
运行

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

  1. def mergeTwoLists(l1, l2):
  2. # 创建一个移动点和头节点
  3. curr = dummy = ListNode(0)
  4. # 移动节点,比较两个链表的值大小
  5. while l1 and l2:
  6. if l1.val < l2.val:
  7. curr.next = l1
  8. l1 = l1.next
  9. else:
  10. curr.next = l2
  11. l2 = l2.next
  12. curr = curr.next
  13. # 当其中一个链表移动完时,将另一个链表剩余的节点拼接即可
  14. curr.next = l1 or l2
  15. return dummy.next
'
运行

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/859327
推荐阅读
相关标签
  

闽ICP备14008679号