一 题目
Given a linked list, rotate the list to the right by k places, where k is non-negative.
Example 1:
Input: 1->2->3->4->5->NULL, k = 2 Output: 4->5->1->2->3->NULL Explanation: rotate 1 steps to the right: 5->1->2->3->4->NULL rotate 2 steps to the right: 4->5->1->2->3->NULL
Example 2:
Input: 0->1->2->NULL, k = 4 Output:2->0->1->NULL
Explanation: rotate 1 steps to the right: 2->0->1->NULL rotate 2 steps to the right: 1->2->0->NULL rotate 3 steps to the right:0->1->2->NULL
rotate 4 steps to the right:2->0->1->NULL
二 分析
medium级别,求链表旋转K步。
链表不同于数组,没法用下标来访问,只能通过指针来遍历,比较麻烦。
遍历整个链表获得链表长度count,然后此时把链表头和尾链接起来组成一个闭环, 再用k求count求余(因为k可能超过count),在往后走count - k % count个节点就到达新链表的头结点前一个点,这时断开链表即可。可以画图辅助理解。
当然提交测试后,各种坑。比如空或者一个元素各种循环导致的超时错误TLE,包括求余都是case遇到了。防不胜防,真是要求要缜密思考。代码如下:
public static void main(String[] args) {
ListNode head = new ListNode(1);
head.next = new ListNode(2);
head.next.next = new ListNode(3);
head.next.next.next = new ListNode(4);
head.next.next.next.next = new ListNode(5);
ListNode res = rotateRight(head,1);
while(res != null){
System.out.print(res.val+"->");
res = res.next;
}
}
public static ListNode rotateRight(ListNode head, int k) {
if(head == null){
return null;
}
if(k==0|| head.next== null){
return head;
}
ListNode res = head;
int count =1;
while(res.next != null){
res = res.next;
count++;
}//闭环
res.next = head;
int m = count- k% count;
ListNode tmp = head;
for(int i=1; i< m;i++){
tmp = tmp.next;
}//找到新节点
ListNode nhead = tmp.next;
//断开链接
tmp.next= null;
return nhead;
}
static class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}
Runtime: 0 ms, faster than 100.00% of Java online submissions for Rotate List.
Memory Usage: 35.8 MB, less than 100.00% of Java online submissions forRotate List.