题目描述:
给定一个链表,判断链表中是否有环。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。
示例 1:
输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。
示例 2:
输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。
示例 3:
输入:head = [1], pos = -1
输出:false
解释:链表中没有环。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/linked-list-cycle
思路:
首节点附上两个指针,第一个指针每次只遍历一个节点,第二个指针每次遍历两个节点,直到这两个指针所指的节点相同时,则说明有环。
代码:
import chaintable as c
class Solution(c.chainTable):
def hasCycle(self, head):
"""
:type head: ListNode
:rtype: bool
"""
node1=head #走一步
node2=head #走两步
while node1.next_node and node2.next_node.next_node:
node1=node1.next_node
node2=node2.next_node.next_node
if node1==node2:
return True
return False
if __name__=='__main__':
chain=c.chainTable()
head = [3,2,0,-4]
pos=1
for i in head:
chain.append(i)
if not pos==-1:
n1=chain.head
n2=chain.head
index=0
while n1.next_node and index<pos:
n1=n1.next_node
index+=1
index=0
while n2.next_node and index<len(head)-1:
n2=n2.next_node
index+=1
n2.next_node=n1
result=Solution().hasCycle(chain.head)
print(result)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
链表的实现:
class Node:
'''
定义节点类
data:节点保存的数据
next_node:下一个节点对象
'''
def __init__(self,data,pnext=None):
self.data=data
self.next_node=pnext
def __repr__(self):
'''
定义Node的字符输出
print为输出data
'''
return str(self.data)
'''
链表类:
属性:
链表头:head
链表长度:length
方法:以下
'''
class chainTable:
def __init__(self):
self.head=None
self.length=0
'判断是否为空列表'
def isEmpty(self):
return self.length==0
'在链表尾增加一个节点'
def append(self,dataorNode):
item = None
if isinstance(dataorNode, Node):
item = dataorNode
else:
item = Node(dataorNode)
if not self.head:
self.head=item
self.length+=1
else:
node=self.head
'循环至最后一个节点'
while node.next_node:
node=node.next_node
node.next_node=item
self.length+=1
'删除一个节点'
def delete(self,index):
if self.isEmpty():
print("Sorry,the chain table is empty")
return
if index<0 or index>=self.length:
print("Error:out of index")
return
if index==0:
self.head=self.head.next_node
self.length-=1
return
Index=0
node=self.head
pre_node=self.head
while node.next_node and Index<index:
pre_node=node
node=node.next_node
Index+=1
if Index==index:
pre_node=node.next_node
self.length-=1
'修改一个节点'
def update(self,index,data):
if self.isEmpty()or index<0 or index>=self.length:
print("Error:out of index")
return
Index=0
node=self.head
while node.next_node and Index<index:
node=node.next_node
Index+=1
if Index==index:
node.data=data
'查找并得到一个节点'
def getItem(self,index):
if self.isEmpty()or index<0 or index>=self.length:
print("Error:out of index")
return
Index=0
node=self.head
while node.next_node and Index<index:
node=node.next_node
Index+=1
return node.data
'查找一个节点的索引'
def getIndex(self,data):
if self.isEmpty():
print("Sorry,the chain table is empty")
return
Index=0
node=self.head
while node:
if node.data==data:
return Index
node=node.next_node
Index+=1
if Index==self.length:
print("\"%s is not found\",%str(data)")
return
'插入一个节点'
def Insert(self,index,dataorNode):
if self.isEmpty():
print("Sorry,the chain table is empty")
return
if index<0 or index>=self.length:
print("Error:out of index")
return
item=None
if isinstance(dataorNode,Node):
item=dataorNode
else:
item=Node(dataorNode)
if index==0:
item.next_node=self.head
self.head=item
self.length+=1
return
Index=0
node=self.head
prev=self.head
while node.next_node and Index<index:
prev=node
node=node.next_node
Index+=1
if Index==index:
item.next_node=node
prev.next_node=item
self.length+=1
'清空链表'
def clear(self):
self.head=None
self.length=0
def __repr__(self):
if self.isEmpty():
return "The chain table is empty"
node=self.head
nlist=''
i=0
while Node:
if node.next_node:
nlist+=str(node.data)+'->'
node=node.next_node
else:
nlist+=str(node.data)+'->None'
node=node.next_node
return nlist
def __getitem__(self, ind):
if self.isEmpty() or ind < 0 or ind >= self.length:
print("error: out of index")
return
return self.getItem(ind)
def __setitem__(self, ind, val):
if self.isEmpty() or ind < 0 or ind >= self.length:
print("error: out of index")
return
self.update(ind, val)
def __len__(self):
return self.length
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 150
- 151
- 152
- 153
- 154
- 155
- 156
- 157
- 158
- 159
- 160
- 161
- 162
- 163
- 164
- 165
- 166
- 167
- 168
- 169
- 170
- 171
- 172
- 173
- 174
- 175
- 176
- 177
- 178
- 179
- 180
- 181
- 182
- 183
- 184