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
解法一
先预处理k,用一个指针把链表跑一遍,算出其长度length,然后令k等于k%length。用三个指针back,cur,pre,cur指向返回结果中的头节点,back指向cur前面那个节点,pre指向最后一个节点。令pre的next指向head,back的next指向null就可以了。
public ListNode rotateRight(ListNode head, int k) {
if(head==null||head.next==null||k==0)
return head;
ListNode cur=head;
ListNode pre=head;
ListNode back=new ListNode(-1);
back.next=head;
int length=1;
while(pre.next!=null)
{
pre=pre.next;
length++;
}
k=k%length;
if(k==0)
return head;
pre=head;
for(int i=1;i<k;i++)
{
if(pre.next==null)
pre=head;
else
pre=pre.next;
}
while(pre.next!=null)
{
pre=pre.next;
cur=cur.next;
back=back.next;
}
pre.next=head;
back.next=null;
return cur;
}
Runtime: 6 ms, faster than 100.00% of Java online submissions for Rotate List.
Memory Usage: 38.1 MB, less than 22.34% of Java online submissions for Rotate List.
解法二
也可以只用两个指针
public ListNode rotateRight(ListNode head, int k) {
if(head==null||head.next==null||k==0)
return head;
ListNode pre=head;
ListNode back=new ListNode(-1);
back.next=head;
int length=1;
while(pre.next!=null)
{
pre=pre.next;
length++;
}
k=k%length;
if(k==0)
return head;
pre=head;
for(int i=1;i<k;i++)
{
if(pre.next==null)
pre=head;
else
pre=pre.next;
}
while(pre.next!=null)
{
pre=pre.next;
back=back.next;
}
pre.next=head;
pre=back.next;
back.next=null;
return pre;
}
Runtime: 6 ms, faster than 100.00% of Java online submissions for Rotate List.
Memory Usage: 38.1 MB, less than 27.52% of Java online submissions for Rotate List.
解法三
把链表首尾相连,然后让指针cur走length-k%length步,断开环形链表即可 返回的头指针为cur后面那个节点
public ListNode rotateRight(ListNode head, int k) {
if(head==null||head.next==null||k==0)
return head;
ListNode cur=head;
int length=1;
while(cur.next!=null)
{
cur=cur.next;
length++;
}
cur.next=head;
cur=head;
for(int i=1;i<length-k%length;i++)
{
cur=cur.next;
}
ListNode newNode=cur.next;
cur.next=null;
return newNode;
}
Runtime: 6 ms, faster than 100.00% of Java online submissions for Rotate List.
Memory Usage: 41.8 MB, less than 5.18% of Java online submissions for Rotate List.