将链表的尾节点移动到头结点处,再完成后的链表再执行该操作,共执行n次。
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
思路:因为链表是从前往后连接的,每次操作尾节点较麻烦,所以可以把链表反转过来,就变成了将头结点移动到尾节点之后,移动n次,之后再把完成后的链表反转过来就是结果了。同时注意,因为是不停循环移动,所以每size次就又回到原链表了,因为只需要循环n%size次就好了,不然循环n次会超时。如图:
Input: 0->1->2->NULL, k = 4 Output:2->0->1->NULL
反转:2->1->0->NULL rotate 1 steps to the right: 1->0->2->NULL rotate 2 steps to the right: 0->2->1->NULL rotate 3 steps to the right:2->1->->0NULL
rotate 4 steps to the right: 1->0->2->null反转回来:2->0->1->null
class Solution { public ListNode rotateRight(ListNode head, int k) { if(head == null || k<0){ return null; } if(head.next == null){ return head; } int count = 1; ListNode p = reverseList(head); ListNode q = p; while(q.next!=null){ q = q.next; count++; } for(int i=0; i < k%count; i++){ q.next = p; q = p; p = q.next; q.next = null; } return reverseList(p); } public static ListNode reverseList(ListNode head) { if(head == null){ return null; } ListNode pre = null; ListNode curr = head; ListNode next = head.next; while(curr.next!=null){ next = curr.next; curr.next = pre; pre = curr; curr = next; } curr.next = pre; ListNode res = curr; return res; } }