【Leetcode】61. Rotate List

题目地址:

https://leetcode.com/problems/rotate-list/

给定一个单链表,再给定一个正整数kk,返回其向右旋转kk步后得到的链表。旋转11步指的是原链表的表尾连到了表头上,并且把原表尾前一个节点与表尾切断,把这个表尾当成新的链表头。

思路是,先算出链表长度ll,然后旋转kk次等价于旋转k%lk\%l次。接着,先找到第lkl-k个节点,然后将链表尾连到链表头上,最后将第lkl-k个节点与其下一个节点断开,断开后的下一个节点即为新链表头。代码如下:

public class Solution {
    public ListNode rotateRight(ListNode head, int k) {
        if (head == null) {
            return null;
        }
        
        ListNode dummy = new ListNode(0);
        dummy.next = head;
        ListNode prev = dummy;

		// 先算长度
        int len = 0;
        while (prev.next != null) {
            len++;
            prev = prev.next;
        }
        
        k %= len;
        // 接着找第len - k个节点
        prev = dummy;
        for (int i = 0; i < len - k; i++) {
            prev = prev.next;
        }
     
     	// 然后找尾节点,连到头上
        ListNode tail = prev;
        while (tail.next != null) {
            tail = tail.next;
        }
        tail.next = head;

		// 此时prev.next就是新链表头,然后还需要把prev和其后的节点断开
        head = prev.next;
        prev.next = null;
        return head;
    }
}

class ListNode {
    int val;
    ListNode next;
    ListNode(int x) {
        val = x;
    }
}

时间复杂度O(n)O(n),空间O(1)O(1)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章