leetcode 141. 环形链表 (python)

基础知识:
参考链接:
https://juejin.im/post/5b93be37e51d450e68674833
本文摘抄出链接中重要的部分,嘿嘿。。

链表是由 一系列的节点(node) 来实现的,通过每一个node存储下一个节点的指针来实现一种快速的插入。

由于链表的功能是依靠节点来完成的,所以链表的建立必然要先建立节点类。我们通过节点间传递值的方式将指针指向下一个节点。如下代码是一个链表的创建过程。

class Node:
    def __init__(self, dataval=None):
        self.dataval = dataval
        self.nextval = None

class SLinkedList:
    def __init__(self):
        self.headval = None
         
li = SLinkedList()
li.headval = Node("Mon")
e2 = Node("Tue")
e3 = Node("Wed")

# 连接第一第二个节点
li.headval.nextval = e2

# 连接第二第三个节点
e2.nextval = e3

print(e2.nextval)
#结果为e3内存地址<__main__.Node object at 0x0000001A0F9644BE0>
print(e2.nextval.dataval)
#结果为e3所代表的值Wed

本题题目:
在这里插入图片描述
题解一:
这一题可以用哈希表来实现,来判断每个节点是否已经被访问过。
如果是链表中存在环,那么必定有一个节点会被第二次访问。
思路清晰了,下面就是代码:(利用一个try,except的异常来实现)

class Solution:
    def hasCycle(self, head):
        dict1 = {}
        i = 0

        while(head):


            try:
                # print(head.val)

                dict1.pop(head)
                # print("###")
                return True

            except:
                # if i == 0:
                #     return False
                # print("*******")
                dict1[head] = i


                # return True

            i += 1


            head = head.next


        return False

时间复杂度O(n),空间复杂度O(n)。
题解二:(双指针)
设置两个指针,一个指针的速度快于另一个指针。在这种情况下,如果链表中存在环,那么快指针循环完一轮后会和慢指针相遇;如果不存在环,则快指针循环结束返回false即可。代码如下:

class Solution:
    def hasCycle(self, head):

    	faster = head
    	slower = head
    	while(faster != None and faster.next != None):
    		
    		faster = faster.next.next
    		slower = slower.next

    		if(faster == slower):
    			return True

    	return False
发布了100 篇原创文章 · 获赞 3 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/cy_believ/article/details/104254218