每日编程(二十)

题目:旋转链表

题目描述:
给定一个链表,旋转链表,将链表每个节点向右移动 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
    }
}

猜你喜欢

转载自blog.csdn.net/LYue123/article/details/88041916