• [LeetCode]Rotate List


    题目:Rotate List

    从第k个位置旋转链表。

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

    思路1:(16ms)

    1.求链表长度,将k取模,保证k小于链表长度;

    2.遍历链表找到k的位置,然后逆置前k个链表节点;

    3.交换前后链表顺序实现旋转。

    思路2(15ms)

    1.求链表长度,将k取模,保证k小于链表长度;

    2.建立和链表等长的数组,将链表中的数据从k处开始复制到数组中;

    3.在从链表头开始将数组中元素复制到链表中,即可实现上述旋转。

    package com.example.medium;
    
    public class RotateRight {
    
        private class ListNode {
            int val;
            ListNode next;
            ListNode(int x) { val = x; }
        }
    
            //思路2
        private ListNode rotateRight2(ListNode head, int k) {
            if(k < 0)return head;
               int length = 0;
            ListNode p = head;
                while(p != null){
                    p = p.next;
                    length++;
                }
                if(k >= length && length != 0)k = k%length;
                if(k == 0 || length == 0)return head;
                int values[] = new int[length];//定义一个数组,从数组的第k个位置开始复制链表的值
                p = head;
                while(p != null){//复制链表元素到数组
                    values[k++] = p.val;
                    if(k >= length)k = 0;//k超过数组尾部时,从零开始
                    p = p.next;
                }
                p = head;
                k = 0;
                while(p != null){//再将数组的值复制回链表
                    p.val = values[k++];
                    p = p.next;
                }
            return head;
        }
    
            //思路1
        private ListNode rotateRight(ListNode head, int k) {
                //int values[] = new int[k];
                if(k < 0)return head;
                int length = 0;
                ListNode p = head;
                while(p != null){//求链表长度
                    p = p.next;
                    length++;
                }
                p = head;
                if(k >= length && length != 0)k = k%length;//求模去掉多余长度
                if(k == 0)return head;
                for(int i = 0;i < k && p != null;i++)p = p.next;//找到k的位置
                if(p == null)return head;//k > head.length
                ListNode q = head;
                while(p.next != null){//逆置链表
                    p = p.next;
                    q = q.next;
                }
                p.next = head;
                head = q.next;
                q.next = null;
                return head;
        }
        
        public void display(){
                int n = 5;
                ListNode head = null;
                for(int i = n;i > 0;i--){
                    ListNode p = new ListNode(i);
                    p.next = head;
                    head = p;
                }
                ListNode p = head;
                while(p != null){
                    System.out.println(p.val);
                    p = p.next;
                }
                p = rotateRight2(head,7);
        }
    
        public static void main(String args[]){
            new RotateRight().display();
        }
    }
  • 相关阅读:
    (转)WCF中的REST是什么
    DrpList
    IIS代码管理(1):遍历应用程序池和属性
    rdp,ListBox,Drp
    在.NET中杀死Word,Excel等进程
    IIS代码管理(2):创建应用程序池和属性
    防止用户重复登录
    asp.net2.0的几种自动生成脚本的原理以及应用
    工厂模式new问题
    我们需要什么样的字段类型?
  • 原文地址:https://www.cnblogs.com/yeqluofwupheng/p/6684840.html
Copyright © 2020-2023  润新知