题目地址:
https://leetcode.com/problems/rotate-list/
给定一个单链表,再给定一个正整数,返回其向右旋转步后得到的链表。旋转步指的是原链表的表尾连到了表头上,并且把原表尾前一个节点与表尾切断,把这个表尾当成新的链表头。
思路是,先算出链表长度,然后旋转次等价于旋转次。接着,先找到第个节点,然后将链表尾连到链表头上,最后将第个节点与其下一个节点断开,断开后的下一个节点即为新链表头。代码如下:
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;
}
}
时间复杂度,空间。