题目:旋转链表
题目描述:
给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。
示例 1:
输入: 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:
输入: 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
分析:先计算链表长度,构成循环链表,然后计算旋转次数,进行旋转,然后断开链表
代码:
/**
* 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
}
cur:=head
length:=1
for cur.Next!=nil{
cur=cur.Next
length++
}
n:=length-(k%length) //旋转次数
cur.Next=head //尾节点
for i:=0;i<n;i++{
cur=cur.Next
head=head.Next
}
cur.Next=nil //断开链表
return head
}
题目:旋转数组
题目描述:给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
示例 1:
输入: [1,2,3,4,5,6,7] 和 k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右旋转 1 步: [7,1,2,3,4,5,6]
向右旋转 2 步: [6,7,1,2,3,4,5]
向右旋转 3 步: [5,6,7,1,2,3,4]
示例 2:
输入: [-1,-100,3,99] 和 k = 2
输出: [3,99,-1,-100]
解释:
向右旋转 1 步: [99,-1,-100,3]
向右旋转 2 步: [3,99,-1,-100]
分析:大同小异,计算旋转次数,进行旋转,这次数组我利用的是双重循环
代码:
func rotate(nums []int, k int) {
n:=len(nums)
k %=n
for j:=0;j<k;j++{
temp:=nums[n-1]
for i:=n-1;i>0;i--{
nums[i]=nums[i-1]
}
nums[0]=temp
}
}