• 链表—判断是否有环


    链表中环的特征: 一定是在链表的最后,不可能出现在链表的中间,因此,有环的链表是没有指向null的节点的。

    解法思路:

    1、硬做

    在足够的时间内,循环,看能否到达null, 如果不能则说明存在环路

    这里“足够的时间”的设定,有点悬学的味道,如何设定得看经验了

    2、将遍历过的节点都存入set集合中,每次迭代都查询set集合,看是否有重复。

    代码实现:

    # Definition for singly-linked list.
    # class ListNode(object):
    #     def __init__(self, x):
    #         self.val = x
    #         self.next = None
    class solution(object):

      def hasCycle(self,head):

        all_pre_element = set()  # 定义set集合,存放已经遍历过的元素

        cur = head # 创建cur变量,存放当前遍历的节点

        while cur: # 判断当前的节点是否为空,如果为空,则结束循环,返回False,判断结束

          if cur in all_pre_element:  # 判断当前元素是否在all_pre_element中,如果在,则返回True,判断结束

            return True

          all_pre_element.add(cur) # 如果当前节点不在all_pre_element中,则把当前节点添加到集合中

          cur = cur.next  #更新cur 变量为下一个节点,继续执行循环

        return False

    时间复杂度:O(n)

    空间复杂度:O(n)

    3、快慢指针(比较复杂的解法,有点反人类思维,哈哈)

    思路:

      快、慢指针都从head节点开始走起, 慢指针每次走1步,快指针每次走2步。

      如果在循环过程中,快慢指针相遇,则存在环路;否则,在快指针走到链表末尾后退出循环

    python代码实现:

    # Definition for singly-linked list.
    # class ListNode(object):
    #     def __init__(self, x):
    #         self.val = x
    #         self.next = None
     
    class solution(object):

      def hasCycle(self,head):

        slow = fast = head

        # 判断链表是否走到底了:

          # 无环路情况时:如果链表元素数组为偶数,则最后一次判断fast会为null,循环退出;如果元素个数为奇数,最后一次判断fast.next为null,也会退出循环。

        while slow and fast and fast.next:

          slow = slow.next  # 慢指针向前走一步

          fast = fast.next.next  # 快指针向前走两步

          if slow is fast:      # 判断快慢指针是否碰撞

            return True  

        return False

    时间复杂度:O(n)

    空间复杂度:O(1)

  • 相关阅读:
    1.解决有冲突的分支,切换分支时,文件不在了 2.冲突解决到底???
    Github到了一个工作区里面。嵌套了
    【计蒜课】【数据结构】【栈的复习】
    【计蒜课】【数据结构】【队列的复习】
    【计蒜课】【数据结构】【邻接矩阵使用的复习】
    【计蒜课】【数据结构】【链表的创建、插入、遍历操作的复习】
    【计蒜课】【数据结构】【顺序表查找、删除、遍历操作的复习答案】
    【计蒜课】【数据结构】【顺序表的构造、插入、扩容操作习题】
    实验六
    6.6实验五
  • 原文地址:https://www.cnblogs.com/wl413911/p/12922404.html
Copyright © 2020-2023  润新知