直接讲清楚反转链表和判断子链表是怎么搞的【python】

这篇具有很好参考价值的文章主要介绍了直接讲清楚反转链表和判断子链表是怎么搞的【python】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Reversed_sub

反向子链表题,直接把反向链表和子链表讲清楚。

反向

假设有一个链表:1 -> 2 -> 3 -> 4 -> None

  1. 初始化三个指针:

    • prev:用于指向当前节点的前一个节点。初始时 prev 为 None。
    • current:用于指向当前节点。初始时 current 指向链表的头节点。
    • next:用于保存当前节点的下一个节点,防止在修改 current.next 值之后丢失对下一个节点的引用。
  2. 进入循环,每次迭代执行以下步骤,直到 current 指向 None(到达链表尾部):

    • 将 current.next 指针指向 prev,即将当前节点的下一个节点指向它的前一个节点,完成反转。
    • 将 prev 指针指向 current,即将 prev 移动到当前节点的位置。
    • 将 current 指针指向 next,即将 current 移动到下一个节点的位置。
    • 将 next 指针指向 current 的下一个节点,以便在下一次迭代中使用。

    循环迭代过程中的具体步骤如下:

    • 第一次迭代:
      1. prev = None
      2. current = 1,next = 2
      3. 将 current.next 指向 prev,即 1 -> None
      4. prev = 1,current = 2,next = 3
    • 第二次迭代:
      1. prev = 1
      2. current = 2,next = 3
      3. 将 current.next 指向 prev,即 2 -> 1
      4. prev = 2,current = 3,next = 4
    • 第三次迭代:
      1. prev = 2
      2. current = 3,next = 4
      3. 将 current.next 指向 prev,即 3 -> 2
      4. prev = 3,current = 4,next = None
    • 第四次迭代:
      1. prev = 3
      2. current = 4,next = None
      3. 将 current.next 指向 prev,即 4 -> 3
      4. prev = 4,current = None,next = None
  3. 循环结束后,prev 指针指向反转链表的头节点,即链表的尾部节点。因此,返回 prev。

最终,链表被反转为:4 -> 3 -> 2 -> 1 -> None

求子链表

假设有两个链表: 主链表:1 -> 2 -> 3 -> 4 -> 5 -> 6 -> None 子链表:2 -> 3 -> 4 -> None

以下是判断子链表是否为主链表的子链表的每一步骤:

  1. 初始化两个指针:
    • 主链表指针 main_ptr:用于遍历主链表。初始时指向主链表的头节点 1。
    • 子链表指针 sub_ptr:用于遍历子链表。初始时指向子链表的头节点 2。
  2. 进入循环,每次迭代执行以下步骤,直到子链表遍历完毕或找到不匹配的节点:
    • 比较当前主链表指针和子链表指针所指向的节点的值。
    • 当前主链表指针指向节点 1,子链表指针指向节点 2。它们的节点值不同,因此进入下一步。
  3. 根据循环结束的情况得出结论:
    • 子链表遍历完毕:如果子链表指针为空(sub_ptr 为 None),则说明子链表已经遍历完毕,即子链表是主链表的子链表。返回 True。
    • 找到不匹配的节点:如果子链表指针不为空(sub_ptr 不为 None),则说明在主链表中找不到与子链表完全匹配的连续节点,即子链表不是主链表的子链表。返回 False。

根据上述过程,可以得出结论:子链表 2 -> 3 -> 4 不是主链表 1 -> 2 -> 3 -> 4 -> 5 -> 6 的子链表。

class Solution:
    def isReverseChild(self, a, b) :
        reversed_b = self.reverse_linked_list(b)  # 反转链表 B
        p1 = a
        while p1:
            if p1.val == reversed_b.val:
                p2 = p1
                p2_reversed = reversed_b
                while p2 and p2_reversed:
                    if p2.val != p2_reversed.val:
                        break
                    p2 = p2.next
                    p2_reversed = p2_reversed.next
                if p2_reversed is None:
                    return True
            p1 = p1.next
        
        return False


    def reverse_linked_list(self,l):
        prev = None
        current = l
        while current:
            next_node = current.next
            current.next = prev
            prev = current
            current = next_node
        return prev
        

以下是每一行代码的详细解释:

  1. p1 = a:初始化指针 p1,指向链表 A 的头节点。
  2. while p1::进入循环,循环条件为 p1 不为空(即链表 A 遍历未结束)。
  3. if p1.val == reversed_b.val::判断当前 p1 所指节点的值是否等于反转后的链表 B 的头节点的值。如果不相等,则说明当前节点不可能是相交节点,跳过下面的判断过程,继续遍历链表 A。
  4. p2 = p1:将指针 p2 指向当前 p1 所指节点,作为链表 A 中可能的相交节点。
  5. p2_reversed = reversed_b:将指针 p2_reversed 指向反转后的链表 B 的头节点,用于与 p2 一起遍历两个链表,比较节点值是否相等。
  6. while p2 and p2_reversed::进入内部循环,循环条件为 p2 和 p2_reversed 都不为空(即两个链表均未遍历结束)。
  7. if p2.val != p2_reversed.val::比较 p2 和 p2_reversed 所指节点的值是否相等。如果不相等,则说明两个链表在当前节点不相交,跳出循环,继续遍历链表 A。
  8. p2 = p2.next:将 p2 指针向后移动一位,继续遍历链表 A。
  9. p2_reversed = p2_reversed.next:将 p2_reversed 指针向后移动一位,继续遍历反转后的链表 B。
  10. if p2_reversed is None::判断是否已经遍历完反转后的链表 B,即 p2_reversed 是否为空。如果为空,则说明两个链表在当前节点相交,返回 True。
  11. p1 = p1.next:将 p1 指针向后移动一位,继续遍历链表 A。

综上所述,这段代码的作用是通过遍历链表 A 和反转后的链表 B,寻找它们的相交节点。如果找到了相交节点,则返回 True;否则返回 False。

需要注意的是,该算法的时间复杂度为 O(m+n),其中 m 和 n 分别表示链表 A 和链表 B 的长度。文章来源地址https://www.toymoban.com/news/detail-747118.html

到了这里,关于直接讲清楚反转链表和判断子链表是怎么搞的【python】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 深刻理解顺序表和链表

    顺序表和链表是我们学习数据结构中不可或缺的部分,他们都属于线性表之一。大家在C语言中都学过数组:⼀组相同类型元素的集合而且在内存中存储是连续的。数组也属于顺序表的一种,顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构。顺序表的出现

    2024年01月23日
    浏览(44)
  • 【数据结构】顺序表和链表

    线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使 用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串... 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的, 线性表在物理上

    2024年01月20日
    浏览(56)
  • 【链表面试题】解决环形链表和相交链表问题

    在力扣上发现这样的几道题,尝试做了一下,也发现了一个关于这类题的一种做法:快慢指针的使用。废话不多说,上例题 目录 一、环形链表 1.定义(概念) 2.如何判断是否为环形链表 1.快慢指针 2.为什么快指针一次走两个结点 3.例题分析 二、相交链表 1.例题分析 2.解法分

    2023年04月17日
    浏览(43)
  • 数据结构2:顺序表和链表

    目录 1.线性表 2.顺序表 2.1概念及结构 2.2接口实现 2.3数据相关面试题 2.4顺序表的问题及思考 3.链表 3.1链表的概念及结构 3.2链表的分类 3.3链表的实现 3.4链表面试题 3.5双向链表的实现 4.顺序表和链表的区别 线性表(linear list)是具有相同特征的数据元素的有限序列。线性表是

    2023年04月17日
    浏览(45)
  • 【数据结构二】链表和LinkedList详解

    目录 链表和LinkedList  1.链表的实现 2.LinkedList的使用 3.ArrayList和LinkedList的区别 4.链表OJ题训练         当 在 ArrayList 任意位置插入或者删除元素时,就需要将后序元素整体往前或者往后 搬移,时间复杂度为 O(n) ,效率比较低,因此 ArrayList 不适合做任意位置插入和删除比较多

    2024年01月20日
    浏览(45)
  • 顺序表和链表的练习题

    该题目需要先对顺序表进行遍历至元素x正确插入位置,再对顺序表完成插入操作。因此涉及到for循环与if语句的使用 该题目需要对顺序表制定元素删除,并且还需要返回值。所以定义的函数接口不能为void类型,使用for循环对p后继顺序表元素进行遍历前移,且考虑可能出现删

    2024年04月22日
    浏览(44)
  • 顺序表和链表对应的经典算法

    目录 一,移除元素 二,合并两个有序数组 三,环形链表的约瑟夫问题 四,链表的中间节点 五,合并两个有序链表 六,反转链表 七,移除链表元素 一,移除元素 思路:定义一个循环遍历数组,如果遇到的不是val就记录下来这个元素,如果不是就跳过 定义两个指针,一个用

    2024年02月21日
    浏览(37)
  • 数据结构:2_顺序表和链表

    线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构, 常见的线性表:顺序表、链表、栈、队列、字符串… 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的 ,线性表在物理上

    2024年01月18日
    浏览(51)
  • 数据结构顺序表和链表(超详细)

    线性表 ( linear list ) 是 n 个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使 用的数据结构, 常见的线性表:顺序表、链表、栈、队列、字符串 ... 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的, 线性表在

    2024年02月13日
    浏览(51)
  • 数据结构:队列(链表和数组模拟实现)

    目录 1.何为队列 2.链表模拟实现 2.1 节点和队列创建 2.2 初始化队列 2.3 入队操作 2.4 出队操作 2.5 遍历队列 2.6 获取队首和队尾元素 2.7 判断队列是否为空 2.8 完整实现 3. 数组模拟实现 3.1 创建队列 3.2 入队和出队操作 3.3 遍历队列 3.4 获取队首和队尾元素  3.5 判断队列是否为空

    2024年02月03日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包