(LC) 61. 旋转链表

61. 旋转链表

给你一个链表的头节点 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 * 109

/**
 * 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 (k==0 || head==null || head.next==null) {
    
     // 判断是有一个或者为空
            return head;
        }
        int n=1;
        ListNode iter = head;

        while (iter.next != null) {
    
     // 计算有多少个元素 为了计算偏移量
            iter = iter.next;
            n++;
        }
        int add = n-k%n; // 如果k>n则会重复反转

        if (add == n) {
    
     // add==n 则不需要反转
            return head;
        }
        iter.next = head;

        while (add-- > 0) {
    
     // 反转过程
            iter = iter.next;
        }
        ListNode ret = iter.next; // 返回的链表
        iter.next = null;
        return ret;
    }
}


猜你喜欢

转载自blog.csdn.net/weixin_45567738/article/details/115260133