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; } }