首页 > 代码库 > [LeetCode]Rotate List

[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();
    }
}

 

[LeetCode]Rotate List