题目
https://leetcode-cn.com/problems/rotate-list/
分析
思路是,把链表连成环再切开。
代码
class Solution {
public ListNode rotateRight(ListNode head, int k) {
if(head==null||k==0||head.next==null)
return head;
ListNode head0=head;
int n=1;//链表长度
while(head0.next!=null){
head0=head0.next;
n++;
}
k=n-k%n;//n-k
if(k==n)
return head;
head0.next=head;
//成为一个环
//此时head0处于尾结点
for(int i=0;i<k;i++){
head0=head0.next;
}//此时head0是新链表的最后一个节点,也就是新链表头结点的原来前一个节点
//断开
ListNode tmp=head0.next;
head0.next=null;
return tmp;
}
}
复杂度
时间复杂度:O(n),最坏情况下,我们需要遍历该链表两次。
空间复杂度:O(1),我们只需要常数的空间存储若干变量。