# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
# @param n int整型
# @param m int整型
# @return int整型
"""
解决思路:(1) 使用getListNode创建环形链表
(2) 使用get_size获取环形链表长度初始值size
(3) 每执行循环一次则减少size的值1
(4)最后当size = 1时,环形链表只剩一个节点,输出该节点的值即可
"""
class ListNode:
def __init__(self, val) -> None:
self.val = val
self.next = None
class Solution:
def LastRemaining_Solution(self, n: int, m: int) -> int:
# write code here
head = self.getListNode(n)
cur = head
pre = None
# 获取环形链表的长度初始值
size = self.get_size(cur)
# 当链表长度大于1时执行循环
while size > 1:
count = 0
# 使用count记录m-1步时,cur和pre的位置
while count < m - 1:
pre = cur
cur = cur.next
count += 1
# 退出循环执行删除节点操作:将pre的next指向cur的next,
pre.next = cur.next
# 此时cur的值需要重新定义到删除值的下一个节点,即pre.next
cur = pre.next
# 环形链表伪长度-1
size -= 1
return cur.val
def getListNode(self, n):
# 创建环形链表
head = ListNode(-1)
cur = head
for i in range(n):
cur.next = ListNode(i)
cur = cur.next
cur.next = head.next
return head.next
def get_size(self, head):
# 获取环形链表的伪长度
lst = []
cur = head
while cur:
if cur.val not in lst:
lst.append(cur.val)
cur = cur.next
else:
break
return len(lst)