zoukankan      html  css  js  c++  java
  • Datawhale编程——链表

    链表

    摘自简书 数据结构:链表

    链表 [Linked List]:链表是由一组不必相连【不必相连:可以连续也可以不连续】的内存结构 【节点】,按特定的顺序链接在一起的抽象数据类型。
    链表常用的有 3 类: 单链表、双向链表、循环链表。

    单链表

    单链表 [Linked List]:由各个内存结构通过一个 Next 指针链接在一起组成,每一个内存结构都存在后继内存结构【链尾除外】,内存结构由数据域和 Next 指针域组成。

    双向链表

    双向链表 [Double Linked List]:由各个内存结构通过指针 Next 和指针 Prev 链接在一起组成,每一个内存结构都存在前驱内存结构和后继内存结构【链头没有前驱,链尾没有后继】,内存结构由数据域、Prev 指针域和 Next 指针域组成。

    循环链表

    单向循环链表 [Circular Linked List] : 由各个内存结构通过一个指针 Next 链接在一起组成,每一个内存结构都存在后继内存结构,内存结构由数据域和 Next 指针域组成。
    双向循环链表 [Double Circular Linked List] : 由各个内存结构通过指针 Next 和指针 Prev 链接在一起组成,每一个内存结构都存在前驱内存结构和后继内存结构,内存结构由数据域、Prev 指针域和 Next 指针域组成。

    leetcode 142

    代码实现

    以下是我个人根据集合实现的,时间复杂度为O(n)。

    class Solution(object):
        def detectCycle(self, head):
            """
            :type head: ListNode
            :rtype: ListNode
            """
            s = set()
            while head:
                if head in s:
                    return head
                s.add(head)
                head = head.next
            return None
    

    下面是最佳实践,空间复杂度为O(1),时间复杂度与上面一样。

    class Solution(object):
        def detectCycle(self, head):
            """
            :type head: ListNode
            :rtype: ListNode
            """
            try:
                fast = head.next
                slow = head
                while fast is not slow:
                    fast = fast.next.next
                    slow = slow.next
            except:
                return None
            
            slow = slow.next
            while slow is not head:
                slow = slow.next
                head = head.next
            return head
    

    最佳实践的思路会有一点抽象,我从leetcode的讨论中截了一段解释

    前面的其实还好理解,主要是fast跟上slow后,slow继续走下去,补全圆圈(即回到E点)所走的路程为 nL-D,直到某一圈恰好等于head所走的H,此时两者会在E点相遇。

    leetcode 206

    代码实现

    这是普通的遍历方法:

    class Solution:
        def reverseList(self, head):
            """
            :type head: ListNode
            :rtype: ListNode
            """
            prev = None
            late = None
            while head:
                prev = head
                head = head.next
                prev.next = late
                late = prev
            return late
    

    下面的是递归方法:

    class Solution:
        def reverseList(self, head):
            """
            :type head: ListNode
            :rtype: ListNode
            """
            if not head or not head.next:
                return head
            p = self.reverseList(head.next)
            head.next.next = head
            head.next = None
            return p
    

    说实话递归方法实在是抽象,我试着画了一幅示意图来帮助理解:

  • 相关阅读:
    GB/T 29311-2020 电气绝缘材料和系统 交流电压耐久性评定
    GB/T 36290.1-2020 电站流程图 第1部分:制图规范
    GB 50646-2020 特种气体系统工程技术标准
    T/CECS 644-2019 恒温恒湿实验室工程技术规程
    GB/T 38808-2020 建筑结构用波纹腹板型钢
    DL/T 1848-2018 220kV和110kV变压器中性点过电压保护技术规范
    这一周发生的事,也该醒醒了!
    pytest-09(conftest.py的层级作用)
    pytest-08(fixtrue的详细使用)
    pytest-07(使用装饰器fixtrue中的autose=True)
  • 原文地址:https://www.cnblogs.com/ChanWunsam/p/10222557.html
Copyright © 2011-2022 走看看