classSolution:
defrotateRight(self, head: Optional[ListNode], k: int) -> Optional[ListNode]:
ifnot head ornot head.nextor k == 0:#如果链表为空或只有一个节点,或者k为0,直接返回原链表头部。return head
# 计算链表的长度
length = 1
tail = head
while tail.next:
length += 1
tail = tail.next# 将k转换为等效的右移步数
k = k % length
if k == 0:#如果k等于链表长度的倍数,相当于没有旋转,直接返回原链表头部。return head
# 执行k次循环for _ inrange(k):
# 取下尾节点
tail = head
while tail.next.next:#使用一个循环找到尾节点的前一个节点
tail = tail.next
new_head = tail.next
tail.next = None#将尾节点取下并断开与之前节点的连接,使其成为新的头节点。# 头插法
new_head.next = head#将新的头节点的next指针指向原来的头节点
head = new_head#更新头节点为新的头节点。return head
法二、快慢指针
classSolution:
defrotateRight(self, head: Optional[ListNode], k: int) -> Optional[ListNode]:
ifnot head ornot head.nextor k == 0:
return head
# 计算链表的长度
length = 1
tail = head
while tail.next:
length += 1
tail = tail.next# 将k转换为等效的右移步数
k = k % length
if k == 0:
return head
# 找到倒数第k个节点
fast = slow = head
for _ inrange(k):
fast = fast.nextwhile fast.next:#将快指针移动到链表的最后一个节点,而慢指针 slow 则移动到了倒数第k个节点的前一个节点
fast = fast.next
slow = slow.next# 重新连接链表
new_head = slow.next
slow.next = None
fast.next = head
return new_head
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人