目录
题目
- 给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。
法一、k次头插法
- 把链表尾的元素取下来头插法放到链表头,k为几就循环几次
class Solution:
def rotateRight(self, head: Optional[ListNode], k: int) -> Optional[ListNode]:
if not head or not head.next or 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 _ in range(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
法二、快慢指针
class Solution:
def rotateRight(self, head: Optional[ListNode], k: int) -> Optional[ListNode]:
if not head or not head.next or 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 _ in range(k):
fast = fast.next
while fast.next:#将快指针移动到链表的最后一个节点,而慢指针 slow 则移动到了倒数第k个节点的前一个节点
fast = fast.next
slow = slow.next
# 重新连接链表
new_head = slow.next
slow.next = None
fast.next = head
return new_head
标签:head,fast,next,链表,61,tail,旋转,节点
From: https://www.cnblogs.com/lushuang55/p/17994705