给定一个链表,旋转链表,将链表每个节点向右移动 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.
 * 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 || head.next == null) {
            return head;
        }
        ListNode p = head;
        //遍历出链表长度
        int length = 0;
        ListNode tail = head;
        for (; tail.next != null; tail = tail.next) {
            length++;
        }
        length++;

        //找到需要反转的节点的前置节点
        for (int i = 1; i < length - k % length; i++) {
            p = p.next;
        }
        //如果反转节点的前置节点是最后一个节点则不需要反转直接返回原头节点
        if (p.next == null) {
            return head;
        } else {
            //新翻转后的头节点指向刚才遍历出的反转节点的前置节点的next节点
            ListNode newHead = p.next;
            //尾节点next指向原head节点
            tail.next = head;
            p.next = null;
            return newHead;
        }
    }
}

LeetCode 原题传送门

Q.E.D.


知识的价值不在于占有,而在于使用