第61题:旋转链表

一. 问题描述

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

二. 解题思路

步骤一:将循环找到单链表的最后一个,将其下一个节点指向第一个节点,此时形成循环链表。

步骤二:得到链表的长度length,然后我们可以知道向右移动k-1个得到的其实就是循环链表从第一个节点开始向后找到length-k%length个结=节点。

步骤三:将此节点断开形成null,此时循环链表又变成单链表,而下一个结点就是头节点。

三. 执行结果

执行用时 :1 ms, 在所有 Java 提交中击败了99.90%的用户。

内存消耗 :35.8 MB, 在所有 Java 提交中击败了82.91%的用户。

四. Java代码

class Solution {
    public ListNode rotateRight(ListNode head, int k) {
         if(head==null||k==0)
    {
        return head;
                
    }
     ListNode first=head;     
     ListNode second=head;
     while(true)
     {
        
         if(second.next==null)
         {
             break;
         }
         second=second.next;
     }
     int length=0;
     ListNode m=head;
     while(m!=null)
     {
         length++;
         m=m.next;
     }
     
     second.next=first;
     length=length-k%length;
     for(int i=1;i<length;i++)
     {
         first=first.next;
     }
    
     second=first;
     first=first.next;
     second.next=null;
    return  first;
    
    }
}

猜你喜欢

转载自www.cnblogs.com/xiaobaidashu/p/11656084.html