美文网首页leetCode
【双指针】旋转链表

【双指针】旋转链表

作者: 修行者12138 | 来源:发表于2020-10-24 17:46 被阅读0次

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/rotate-list

AC代码

public ListNode rotateRight(ListNode head, int k) {
    if (null == head || k == 0) {
        return null;
    }

    // 定义left、right双指针
    ListNode left = head;
    ListNode right = head;

    // right指针先走k步
    for (int i = 1; i <= k; i++) {
        // 如果没走完k步,发现right.next为null,说明链表长度小于k,且链表长度为i
        // 把k设为k % i,right指针重新走k步
        if (null == right.next) {
            k %= i;
            // k为0,说明k是链表长度的倍数,直接返回head
            if (k == 0) {
                return head;
            }
            right = head;
            for (int j = 1; j <= k; j++) {
                right = right.next;
            }
            break;
        }
        right = right.next;
    }

    // 双指针同时走,直到right.next为null,即right指向最后一个节点
    // 此时left指针后刚好有k个节点,因为right指针提前走了k步
    while (right.next != null) {
        left = left.next;
        right = right.next;
    }

    // 把left指针之前的节点(包含left指向的节点)移到right节点后面
    ListNode newHead = left.next;
    right.next = head;
    left.next = null;

    return newHead;
}
image.png

相关文章

网友评论

    本文标题:【双指针】旋转链表

    本文链接:https://www.haomeiwen.com/subject/ztynmktx.html