61. Rotate List

Medium
Given a list, rotate the list to the right by k places, where k is non-negative.

For example:
Given 1->2->3->4->5->NULL and k = 2,
return 4->5->1->2->3->NULL.

终于又不看答案写出来一道medium, 渣渣就是这么容易满足。这道题一开始也美看懂那个k指的是什么,后来用了几个Custom Testcase自己看了下,意思是从链表尾部往前数k个节点一起按原顺序移动到链表首部。
首先通过curt遍历链表来计算节点总数total, 当k > total的时候实际上移动了k % total个元素,所以干脆让k = k % total. 同时prev被移动到了原链表尾部。根据题意,原链表尾部肯定会接上原链表首部,所以让prev.next = head.
然后我们来找rotate后链表的头。用prev来遍历,count来计数,当count == total - k的时候,prev.next就是新链表头所在的位置。然后我们让之前保存的dummy的next等于prev.next, 就设置好了新的链表头,返回dummy.next即可。

WechatIMG53.jpeg
/**
 * 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 || head.next == null || k == 0){
            return head;
        }
        ListNode dummy = new ListNode(-1);
        dummy.next = head;
        ListNode prev = dummy;
        ListNode curt = head;
        int total = 0;
        while (curt != null){
            total++;
            curt = curt.next;
            prev = prev.next;
        }
        k = k % total;
        prev.next = head;
        int count = 0;
        while (count < total - k){
            prev = prev.next;
            count++;
        }
        dummy.next = prev.next;
        prev.next = null;
        return dummy.next; 
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 14,349评论 0 33
  • Given a list, rotate the list to the right by k places, w...
    ShutLove阅读 1,007评论 0 0
  • 原题 给定一个链表,旋转链表,使得每个节点向右移动k个位置,其中k是一个非负数。 样例给出链表1->2->3->4...
    Jason_Yuan阅读 1,690评论 0 0
  • Given a list, rotate the list to the right by k places, w...
    Jeanz阅读 1,625评论 0 0
  • 题目描述:给一个链表和非负整数k,将其在下标k处翻转。如: Given 1->2->3->4->5->NULL a...
    Nautilus1阅读 988评论 0 0