我的LeetCode代码仓:https://github.com/617076674/LeetCode
原题链接:https://leetcode-cn.com/problems/rotate-list/description/
题目描述:
知识点:链表
思路:移动一步到位
如果像题目示例的解释那样一步步地移动,显然太费时间了。我们只要找准在哪个点进行切断即可。对于示例1,我们找准在3和4之间切断。对于示例2,我们找准在1和2之间切断。
为避免对头节点的特殊处理,设立虚拟头节点dummyHead。
为了避免重复移动,如果k大于等于链表的长度len,直接令k = k % len。这时候得到的k值才是真正应该移动的k值。
接着我们设两个指针cur1和cur2,其中令cur1指向链表中的最后一个节点,cur2指向链表中的倒数第k + 1个节点。接着进行链表指针的交换操作即可。
因为我们遍历了整个链表求其长度,因此时间复杂度是O(n),其中n为链表的长度。空间复杂度是O(1)。
JAVA代码:
public class Solution {
public ListNode rotateRight(ListNode head, int k) {
if(head == null || head.next == null) {
return head;
}
ListNode dummyHead = new ListNode(-1);
dummyHead.next = head;
ListNode cur = dummyHead;
int len = 0;
while(cur.next != null) {
cur = cur.next;
len++;
}
while(k >= len) {
k -= len;
}
if(k == 0) {
return head;
}
ListNode cur1 = dummyHead;
ListNode cur2 = dummyHead;
for(int i = 0; i < k; i++) {
cur1 = cur1.next;
}
while(cur1.next != null) {
cur1 = cur1.next;
cur2 = cur2.next;
}
cur1.next = dummyHead.next;
dummyHead.next = cur2.next;
cur2.next = null;
return dummyHead.next;
}
}
LeetCode解题报告: