LeetCode61. 旋转链表

LeetCode61. 旋转链表

题目描述

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

思路分析

  1. 旋转链表,也就是将链表的每个节点向右移动 k 个位置,考虑先将链表置为环形链表
  2. 先计算原始链表的长度,将链表向右移动k个节点,也就是将环形链表从前往后的第 len - k % len个位置断开形成的新链表
  3. 将新链表返回
  4. 详解见下

源码及详解

/**
     * 旋转链表
     * @param head 要旋转的链表
     * @param k    移动的次数
     * @return     返回旋转后的新链表
     */
    public ListNode rotateRight(ListNode head, int k) {
        //数据校验
        if (head == null || k == 0 || head.next == null) {
            return head;
        }
        //定义变量保存链表的长度
        int len = 1;
        //定义辅助变量用于遍历链表
        ListNode cur = head;
        //计算链表的长度
        while (cur.next != null) {
            cur = cur.next;
            len++;
        }
        //则循环结束后len为链表的长度,并且cur指向链表的末尾
        //将链表形成环状
        cur.next = head;
        //则根据向右移动的位置在指定位置断开环状链表
        int index = len - k % len;
        //即在index处断开环形链表
        ListNode newHead = new ListNode();
        cur = head;
        for (int i = 0; i < index - 1; i++) {
            cur = cur.next;
        }
        //循环结束时找到要断开的位置
        newHead.next = cur.next;
        //断开环形链表
        cur.next = null;
        //返回新链表
        return newHead.next;
    }
posted @ 2021-06-04 10:29  mx_info  阅读(39)  评论(0)    收藏  举报