• 61. 旋转链表


    欢迎关注我的公众号《小沈干货》,谢谢大家。

    给定一个链表,旋转链表,将链表每个节点向右移动 个位置,其中 是非负数。

    示例 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


    思路:首先需要一次循环判断一共有多少个节点,这样避免k值过大,造成旋转节点多次无用重复,会出现超时。
        接下用k对节点数取余,这就是要循环的次数,也即右指针与左指针之间的节点个数。leetcode19题就是这种解题思路。
        然后用双指针,right先循环上面算出的值,然后right.next!=null时,right和left都一直往后取,最后的left就是旋转结束时的最后一个节点
        left后面的节点就是要拿到前面去的节点。


    /**
     * Definition for singly-linked list.
     * public class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode(int x) { val = x; }
     * }
     */
    class Solution {
        public ListNode rotateRight(ListNode head, int k) {
           if(head == null || head.next == null || k==0)
               return head;
            
            ListNode dummyHead = new ListNode(0);
            dummyHead.next = head;
            ListNode left = dummyHead;
            ListNode right = head;
            ListNode check = head;
            long flag = 0;
            while(check!=null){
                check = check.next;
                flag++;
            }
                
            for(int i = 0;i<k%flag;i++){
                if(right.next!=null)
                    right = right.next;
                else
                    right = head;
            }
            
            while(right!=null){
                right = right.next;
                left = left.next;
            }
            
            ListNode cur = left.next;
            ListNode temp = cur;
            left.next = null;
            while(temp!=null && temp.next!=null){
                temp = temp.next;
            }
            if(cur!=null){
                temp.next = head;
                dummyHead.next = cur;
            }
               
            return dummyHead.next;     
        }
    }
  • 相关阅读:
    stl学习笔记—set/multimap
    2013 杭州站 hdoj4778 Gems Fight!
    矩阵加速数列递推
    暑假写的两个数据结构
    AC自动机模板 hdoj2222 UVA-11468
    树莓派安装3.5英寸触摸屏幕
    树莓派设置NTP同步
    在树莓派上设置无线静态IP
    运行tomcat7w.exe未安装指定的服务
    LoadRunner 11安装Micosoft Visual C++ 2005 SP1时提示命令行选项语法错误
  • 原文地址:https://www.cnblogs.com/wenbinshen/p/10743891.html
Copyright © 2020-2023  润新知