zoukankan      html  css  js  c++  java
  • 第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;
        
        }
    }
  • 相关阅读:
    Nginx的编译,和简单的配置问题
    项目课DNS主域名解析服务器(四)
    项目课DHCP服务(三)
    项目课PXE自动装机(二)
    Nginx 详细讲解
    ansible批量管理工具的搭建与简单的操作
    SUID,SGID,SBIT这些到底是什么
    密码截取
    分治和递归的算法实现求数组A[n]中的前k个最大数
    回溯法实现求1n个自然数中r个数的组合
  • 原文地址:https://www.cnblogs.com/xiaobaidashu/p/11656084.html
Copyright © 2011-2022 走看看