zoukankan      html  css  js  c++  java
  • 【leetcode刷题笔记】Rotate List

    Given a list, rotate the list to the right by k places, where k is non-negative.

    For example:
    Given 1->2->3->4->5->NULL and k = 2,
    return 4->5->1->2->3->NULL.


    题解:首先注意一点是n可以比链表的length大。例如链表1->2,n=3,那么执行3次rotate的过程如下:

    第一次:2->1;

    第二次:1->2;

    第三次:2->1;

    那么我们是不是就要模拟了呢?答案是不用,只要用n = n%length就可以在一次遍历中完成转换。

    还是快慢指针的思想,fast指针比slow指针快n+1步,当fast指针到达尾部时,slow指针的next元素就是新的链表头。还需要一个tail指针作为fast指针的前驱,并在最后利用tail指针把前半段链表链接起来。

    代码如下:

     1 /**
     2  * Definition for singly-linked list.
     3  * public class ListNode {
     4  *     int val;
     5  *     ListNode next;
     6  *     ListNode(int x) {
     7  *         val = x;
     8  *         next = null;
     9  *     }
    10  * }
    11  */
    12 public class Solution {
    13     private int getLength(ListNode head){
    14         int answer = 0;
    15         while(head != null){
    16             answer++;
    17             head = head.next;
    18         }
    19         
    20         return answer;
    21     }
    22     
    23     public ListNode rotateRight(ListNode head, int n) {
    24         if(head == null || head.next == null)
    25             return head;
    26         
    27         int length = getLength(head);
    28         if(n == 0)
    29             return head;
    30         n = n % length;
    31         
    32         ListNode dummy = new ListNode(0);
    33         dummy.next = head;
    34         ListNode slow = dummy;
    35         ListNode fast = head;
    36         for(int i = 0;i < n;i++)
    37                 fast = fast.next;
    38         
    39         ListNode tail = fast;
    40         while(fast != null){
    41             slow = slow.next;
    42             tail = fast;
    43             fast = fast.next;
    44         }
    45         tail.next = dummy.next;
    46         dummy = slow.next;
    47         slow.next = null;
    48         return dummy;
    49     }
    50 }
  • 相关阅读:
    第一台虚拟机联网
    情话
    03-Linux的shell命令 .doc
    Linux系统目录结构介绍
    href 里面 链接前面加/与不加的区别?(绝对路径与相对路径)
    本地仓库关联远程仓库,从远程仓库克隆代码
    HTml <meta>标签的使用(重要)
    JS中 submit提交与Form表单里的onsubmit的调用问题?
    JS中 confirm()方法的使用?
    表单数据校检方法 onsubmit()的使用?
  • 原文地址:https://www.cnblogs.com/sunshineatnoon/p/3863471.html
Copyright © 2011-2022 走看看