题目
给定一个链表的头节点
head
,返回链表开始入环的第一个节点。 如果链表无环,则返回null
。如果链表中有某个节点,可以通过连续跟踪
next
指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数pos
来表示链表尾连接到链表中的位置(索引从 0 开始)。如果pos
是-1
,则在该链表中没有环。注意:pos
不作为参数进行传递,仅仅是为了标识链表的实际情况。不允许修改 链表。
解题
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
def detectCycle(head):
"""
检测链表是否存在环并返回环的起始节点。
参数:
head (ListNode): 链表的头节点。
返回值:
ListNode: 环的起始节点,如果无环则返回 None。
"""
if not head or not head.next:
return None
slow, fast = head, head
while fast and fast.next:
slow = slow.next # 慢指针每次移动一步
fast = fast.next.next # 快指针每次移动两步
if slow == fast:
# 找到环,确定环的起始节点
entry = head
while entry != slow:
entry = entry.next
slow = slow.next
return entry
return None
def print_cycle_node(node):
"""
打印环的起始节点值,如果存在环;否则打印“无环检测到”。
参数:
node (ListNode): 环的起始节点或 None。
"""
if node:
print(f"环开始于节点值: {node.val}")
else:
print("无环检测到。")
def test_detectCycle():
# 测试用例 1: 无环的链表
# 构建链表: 1 -> 2 -> 3 -> 4
node1 = ListNode(1)
node2 = ListNode(2)
node3 = ListNode(3)
node4 = ListNode(4)
node1.next = node2
node2.next = node3
node3.next = node4
# 预期输出: 无环检测到。
print("测试用例 1:")
print_cycle_node(detectCycle(node1))
# 测试用例 2: 链表在节点 2 处有环
# 构建链表: 1 -> 2 -> 3 -> 4 -> 2 (环)
node1.next = node2
node2.next = node3
node3.next = node4
node4.next = node2 # 在此处形成环
# 预期输出: 环开始于节点值: 2
print("测试用例 2:")
print_cycle_node(detectCycle(node1))
# 运行测试函数
test_detectCycle()
测试用例 1:
无环检测到。
测试用例 2:
环开始于节点值: 2