143 字 少于 1 分钟阅读

[题目描述] (https://leetcode.cn/problems/rotate-list/)

给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。

示例 1:

img
输入:head = [1,2,3,4,5], k = 2
输出:[4,5,1,2,3]

示例 2:

img
输入:head = [0,1,2], k = 4
输出:[2,0,1]

提示:

  • 链表中节点的数目在范围 [0, 500]
  • -100 <= Node.val <= 100
  • 0 <= k <= 2 * 10^9

解法

先将链表截成两段,然后再拼接即可。

class Solution {
    public ListNode rotateRight(ListNode head, int k) {
        if (head == null || head.next == null) {
            return head;
        }
        int len = 1;
        // 获取尾结点用于连接头结点,并获取链表长度
        ListNode tail = head;
        while (tail.next != null) {
            len++;
            tail = tail.next;
        }
        k %= len;
        if (k == 0) {
            // 无需操作
            return head;
        }
        // 获取链表截断位置
        ListNode breakPos = head;
        ListNode tmp = head;
        while (tmp != null) {
            if (k < 0) {
                breakPos = breakPos.next;
            }
            tmp = tmp.next;
            k--;
        }
        // 截断并拼接新的链表
        tail.next = head;
        head = breakPos.next;
        breakPos.next = null;
        return head;
    }
}