给定一个链表,旋转链表,将链表每一个节点向右移动 k 个位置,其中 k 是非负数。指针
示例 1:code
输入: 1->2->3->4->5->NULL, k = 2 输出: 4->5->1->2->3->NULL 解释: 向右旋转 1 步: 5->1->2->3->4->NULL 向右旋转 2 步: 4->5->1->2->3->NULL
示例 2:it
输入: 0->1->2->NULL, k = 4 输出: 2->0->1->NULL 解释: 向右旋转 1 步: 2->0->1->NULL 向右旋转 2 步: 1->2->0->NULL 向右旋转 3 步: 0->1->2->NULL 向右旋转 4 步: 2->0->1->NULL
思路:先把链表首尾相连,再找到位置断开循环。io
经过代码以下:class
# Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: # 时间复杂度O(n),空间复杂度O(1) def rotateRight(self, head: ListNode, k: int) -> ListNode: if not head or not head.next: return head # 标记尾节点 # 统计节点总数,防止k过大循环移动指针而超出时间限制 c, sum = head, 1 while c.next: sum += 1 c = c.next tail = c c.next = head p, c = head, head p2 = p.next # 记录未来断开后的首节点 k = k%sum # c先于p指针前k%num个 while k: c = c.next k -= 1 # 在p位置断开 while c != tail: c = c.next p = p.next p2 = p.next p.next = None return p2