61. 旋转链表

题目:

思路:

【1】关键点:首先k是会存在大于链表个数count的情况的(因为如果是大于的情况就相当于是绕了圈后再偏移),基于此就必须先遍历一遍拿出count是多少,然后计算出正确的偏移值k1 = k%count;然后将链表分为两部分, 断开链接(形成了 【head,pre】 和 【cur,end】两个链表然后拼接成【cur,end】->【head,pre】即可)

代码展示:

//时间0 ms 击败 100%
//内存40.3 MB 击败 74.67%
//时间复杂度:O(n),最坏情况下,我们需要遍历该链表两次。
//空间复杂度:O(1),我们只需要常数的空间存储若干变量。
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode rotateRight(ListNode head, int k) {
        if (head == null) return head;
        int count = 0;
        ListNode temp = head , end = head;
        while (temp != null){
            // 统计个数
            count++;
            // 记录最后的节点
            end = temp;
            temp = temp.next;
        }
        // 如果 k = 7,当节点总数为5,那么实际不过是绕了一圈再向右偏移两个节点
        // 所以直接省略绕圈部分
        k = k%count;
        // 相当于没有偏移
        if (k == 0) return head;
        // 找到分界的节点
        temp = head;
        for (int i = 1; i < count - k; i++){
            temp = temp.next;
        }
        ListNode pre = temp , cur = temp.next;
        // 断开链接(形成了 【head,pre】 和 【cur,end】两个链表然后拼接成【cur,end】->【head,pre】即可)
        pre.next = null;
        //重新组合成新的链表
        end.next = head;
        return cur;
    }
}

 

posted @ 2023-07-06 12:06  忧愁的chafry  阅读(9)  评论(0编辑  收藏  举报