码迷,mamicode.com
首页 > 其他好文 > 详细

61. 旋转链表

时间:2019-05-10 11:27:45      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:ast   tno   public   int   head   示例   输出   nod   移动   

题目描述

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

分析

k = (len + (k % len)) % len;是关键,求出最少旋转几次,因为可能k比len还要大。然后使用快慢指针来交换。

贴出代码

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode rotateRight(ListNode head, int k) {
        if(head == null || k < 0){
            return head;
        }
        ListNode tmp = new ListNode(0);
        tmp.next = head;
        ListNode slow = tmp;
        ListNode fast = tmp;
        int len = 0;
        while(slow.next != null){
            len ++;
            slow = slow.next;
        }
        slow = tmp;
        // 求出旋转多少次,因为可能k比len还要大
        k = (len + (k % len)) % len;
        if(k == 0){
            return tmp.next;
        }
        while(-- k >= 0){
            fast = fast.next;
        }
        while(fast.next != null){
            fast = fast.next;
            slow = slow.next;
        }
        tmp.next = slow.next;
        fast.next = head;
        slow.next = null;
        return tmp.next;
    }
}

61. 旋转链表

标签:ast   tno   public   int   head   示例   输出   nod   移动   

原文地址:https://www.cnblogs.com/Tu9oh0st/p/10843152.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!