【算法】【线性表】【链表】旋转链表

1  题目

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

示例 1:

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

示例 2:

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

提示:

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

2  解答

先对 k 降级,然后找断点,然后拼接两个链表即可:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 * int val;
 * ListNode next;
 * ListNode() {}
 * ListNode(int val) { this.val = val; }
 * ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode rotateRight(ListNode head, int k) {
        // 参数边界校验
        if (head == null || head.next == null || k <= 0) {
            return head;
        }
        // 计算节点的数量
        int sum = 0;
        ListNode node = head;
        while (node != null) {
            sum ++;
            node = node.next;
        }
        // 对 k 进行降级
        // 比如 长度为5 k=7,那么其实就是和k=2的效果一样的
        k = k % sum;
        // 如果降级后为0,直接返回吧
        if (k == 0) {
            return head;
        }
        // 这道题其实就是把链表变成了两段
        // 比如sum 长度 = 5
        // k = 2
        // 其实就是把第3(5-2)个后边的元素都移到前边
        // 还是照常我喜欢加一个头节点
        ListNode preNode = new ListNode(0);
        preNode.next = head;
        node = preNode;
        // 计数器 计算遍历到第几个节点了,然后当count == target时,就把后边的元素放到前边
        // 这个后边的移到前边就是断点后的最后一个元素的next 指向preNode.next即可。
        int target = sum - k;
        int count = -1;
        while (node != null) {
            count ++;
            // 到达第 k 个元素 到达断点
            if (count == target) {
                break;
            }
            node = node.next;
        }
        ListNode markNode = node, markNextNode = node.next;
        // 遍历到尾部
        while (node.next !=null) {
            node = node.next;
        }
        // 尾部的next 指向preNode.next 首位连接
        node.next = preNode.next;
        // 然后把断点的元素的next 设置为空
        markNode.next = null;
        // 然后返回断点的起始元素
        return markNextNode;
    }
}

加油。

posted @ 2024-01-15 07:11  酷酷-  阅读(6)  评论(0编辑  收藏  举报