基础知识:
参考链接:
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