环形链表(python实现)
生活随笔
收集整理的這篇文章主要介紹了
环形链表(python实现)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目描述:
給定一個鏈表,判斷鏈表中是否有環。
為了表示給定鏈表中的環,我們使用整數 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 cclass 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_nodenode2=node2.next_node.next_nodeif node1==node2:return Truereturn Falseif __name__=='__main__':chain=c.chainTable()head = [3,2,0,-4]pos=1for i in head:chain.append(i)if not pos==-1:n1=chain.headn2=chain.headindex=0while n1.next_node and index<pos:n1=n1.next_nodeindex+=1index=0while n2.next_node and index<len(head)-1:n2=n2.next_nodeindex+=1n2.next_node=n1result=Solution().hasCycle(chain.head)print(result)鏈表的實現:
class Node:'''定義節點類data:節點保存的數據next_node:下一個節點對象'''def __init__(self,data,pnext=None):self.data=dataself.next_node=pnextdef __repr__(self):'''定義Node的字符輸出print為輸出data'''return str(self.data) ''' 鏈表類: 屬性: 鏈表頭:head 鏈表長度:length 方法:以下 ''' class chainTable:def __init__(self):self.head=Noneself.length=0'判斷是否為空列表'def isEmpty(self):return self.length==0'在鏈表尾增加一個節點'def append(self,dataorNode):item = Noneif isinstance(dataorNode, Node):item = dataorNodeelse:item = Node(dataorNode)if not self.head:self.head=itemself.length+=1else:node=self.head'循環至最后一個節點'while node.next_node:node=node.next_nodenode.next_node=itemself.length+=1'刪除一個節點'def delete(self,index):if self.isEmpty():print("Sorry,the chain table is empty")returnif index<0 or index>=self.length:print("Error:out of index")returnif index==0:self.head=self.head.next_nodeself.length-=1returnIndex=0node=self.headpre_node=self.headwhile node.next_node and Index<index:pre_node=nodenode=node.next_nodeIndex+=1if Index==index:pre_node=node.next_nodeself.length-=1'修改一個節點'def update(self,index,data):if self.isEmpty()or index<0 or index>=self.length:print("Error:out of index")returnIndex=0node=self.headwhile node.next_node and Index<index:node=node.next_nodeIndex+=1if Index==index:node.data=data'查找并得到一個節點'def getItem(self,index):if self.isEmpty()or index<0 or index>=self.length:print("Error:out of index")returnIndex=0node=self.headwhile node.next_node and Index<index:node=node.next_nodeIndex+=1return node.data'查找一個節點的索引'def getIndex(self,data):if self.isEmpty():print("Sorry,the chain table is empty")returnIndex=0node=self.headwhile node:if node.data==data:return Indexnode=node.next_nodeIndex+=1if 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")returnif index<0 or index>=self.length:print("Error:out of index")returnitem=Noneif isinstance(dataorNode,Node):item=dataorNodeelse:item=Node(dataorNode)if index==0:item.next_node=self.headself.head=itemself.length+=1returnIndex=0node=self.headprev=self.headwhile node.next_node and Index<index:prev=nodenode=node.next_nodeIndex+=1if Index==index:item.next_node=nodeprev.next_node=itemself.length+=1'清空鏈表'def clear(self):self.head=Noneself.length=0def __repr__(self):if self.isEmpty():return "The chain table is empty"node=self.headnlist=''i=0while Node:if node.next_node:nlist+=str(node.data)+'->'node=node.next_nodeelse:nlist+=str(node.data)+'->None'node=node.next_nodereturn nlistdef __getitem__(self, ind):if self.isEmpty() or ind < 0 or ind >= self.length:print("error: out of index")returnreturn self.getItem(ind)def __setitem__(self, ind, val):if self.isEmpty() or ind < 0 or ind >= self.length:print("error: out of index")returnself.update(ind, val)def __len__(self):return self.length總結
以上是生活随笔為你收集整理的环形链表(python实现)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Nginx优化方案
- 下一篇: Leetcode链表考察(Python、