0061.旋转链表

方法一:快慢指针

时间复杂度 $O(n)$,空间复杂度 $O(1)$,n 表示链表的长度。

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func rotateRight(head *ListNode, k int) *ListNode {
	if head == nil || head.Next == nil {
		return head
	}
	n, p, q, ans := 0, head, head, head
	for ; p != nil; p = p.Next {
		n++
	}
	k, p = k%n, head
	for i := 0; i < k; i++ {
		p = p.Next
	}
	for p != nil && p.Next != nil {
		p = p.Next
		q = q.Next
	}
	if k != 0 {
		ans = q.Next
		p.Next, q.Next = head, p.Next
	}
	return ans
}