题目
给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。
示例 1:
输入: 1->2->3->4->5->NULL, k = 2
输出: 4->5->1->2->3->NULL
解释: 向右旋转 1 步: 5->1->2->3->4->NULL 向右旋转 2 步: 4->5->1->2->3->NULL
示例 2:输入: 0->1->2->NULL, k = 4
输出: 2->0->1->NULL
解释: 向右旋转 1 步: 2->0->1->NULL 向右旋转 2 步: 1->2->0->NULL 向右旋转 3 步: 0->1->2->NULL 向右旋转 4 步: 2->0->1->NULL
解题思路
在k<链表长度len的前提下,使用2个指针p、q,q指向链表的最后一个结点,p指向q第前k个结点,然后q.next ->head,p的前一个结点指向null,即可旋转完成。
k大于链表长度的话,则直接求k%len即可。
代码如下
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode rotateRight(ListNode head, int k) {
if(k == 0) return head;
if(head == null || head.next == null) return head;
ListNode p = head, q = head, ppre = head;
for(int i = 2; i <= k; i ++) {
q= q.next;
//说明k大于或等于链表的长度
if(q.next==null) {
return rotateRight(head, k%i);
}
}
//q走到最后一个节点
while(q.next != null) {
if(p != head)
ppre = ppre.next;
p = p.next;
q = q.next;
}
//旋转链表
q.next = head;
ppre.next = null;
return p;
}
}
提交结果
成功
显示详情
执行用时 : 2 ms, 在Rotate List的Java提交中击败了98.90% 的用户
内存消耗 : 36.1 MB, 在Rotate List的Java提交中击败了82.48% 的用户