61、循环链表
给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。
示例 1:
输入:head = [1,2,3,4,5], k = 2
输出:[4,5,1,2,3]
示例 2:
输入:head = [0,1,2], k = 4
输出:[2,0,1]
提示:
链表中节点的数目在范围 [0, 500] 内
-100 <= Node.val <= 100
0 <= k <= 2 * 109
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/rotate-list
解题思路
先遍历链表获取链表长度,然后将链表首尾相连,向后移动k位即代表最后k个数按顺序移到链表前端。
所以只需在倒数第k个数的前端断开循环链表即可。
完成用时:12min
代码
/**
* 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) {
int len =1;
ListNode Pnode =head;
if(head == null)
return head;
while(Pnode.next != null){
Pnode=Pnode.next;
len++;
}
Pnode.next=head;
Pnode=Pnode.next;
k=len-(k%len);
for(int i=0;i<k-1;i++)
Pnode=Pnode.next;
head = Pnode.next;
Pnode.next = null;
return head;
}
}
复杂度分析
时间复杂度:O(n) 遍历链表两次,第一次为链表长度n第二次为n-k(最坏情况k=0)。
空间复杂度:O(1) 在原链表上进行操作,不需要额外空间。