Given a list, rotate the list to the right by k places, where k is non-negative.
For example:
Given 1->2->3->4->5->NULL
and k = 2
,
return 4->5->1->2->3->NULL
.
题目意思不难,就是说给一个数k,然后从右向左数第k个节点,然后以这个节点为开头,重新组成一个链表。
需要注意的就是如果k大于链表长度len,那么就要k = k%len
小技巧就是在k<len时,是可以先从前向后数k个数,然后再从当前位置(flag)和head开始向后遍历到结尾,这样效率会高一些。
但是第一次的速度不是很快,耗时15ms。
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ public class Solution { public ListNode rotateRight(ListNode head, int k) { if( k == 0 || head == null){ return head; } ListNode flag = head; int len; for( len = 1;len < k && flag.next != null ; len++){ flag = flag.next; } if( len == k){ if( flag.next == null) return head; ListNode result = head ; flag = flag.next; while( flag.next != null){ result = result.next; flag = flag.next; } flag.next = head; flag = result.next; result.next = null; return flag; } ListNode last = flag; if( k > len) k = len - k%len; else k = len-k; if( k == 0 || k == len) return head; flag = head; for( int i = 1;i<k ;i++){ flag = flag.next; } last.next = head; head = flag.next; flag.next = null; return head; } }
然后看了看网上1ms的答案,其实也没什么区别,然后拿他们的跑一下,结果15、16ms,所以还是leetcode网站本身(也许是java虚拟机)的问题。