您的位置:首页 > 其它

[LeetCode]Rotate List

2016-10-27 20:02 204 查看
Question

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
.

本题难度Medium。

双指针法

【复杂度】

时间 O(N) 空间 O(1)

【思路】

旋转链表的本质,就是把链表的后半部分放到前面来,所以关键在于如何找链表后半部分的起始节点。实际上,我们用一个快指针先走k步,然后快慢指针同时走,这样当快指针到末尾时,慢指针就到链表后半部分的起始节点了。不过,由于k可能大于链表的长度,所以我们要先对k取链表长度的模。要计算链表长度只要遍历一遍链表就行了。

【注意】

k取余后为0,或者原链表为空的情况下,都要直接返回原链表,不然将慢指针的下一个作为新链表头会出错。

【代码】

/**
* 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) {
//require
if(k==0||head==null)
return head;
ListNode fast=head;
int size=0;
//计算链表长度
while(fast!=null){
size++;
fast=fast.next;
}
k=k%size;  //取模
fast=head;
//fast指针先走k步
for(int i=0;i<k;i++)
fast=fast.next;
ListNode low=head;

//invariant
while(fast.next!=null){
fast=fast.next;
low=low.next;
// 将后半部分放到前面来
fast.next=head;
head=low.next;
low.next=null;
//ensure
return head;
}
}


参考

[Leetcode] Rotate List 旋转链表
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode