Rotate List
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小于链表的长度,我们可以获得,第一个节点(first节点),以及第(k+1)个节点(last节点),然后对这两个节点不断求其next直到last节点的next指向null。此时first的next就是旋转之后的起始节点,令last.next = head(第一个节点),head = first.next,first.next = null。返回head即可。
对于k大于链表的长度,先获得最后一个节点(last)以及链表的长度length,令last.next = head。求得k除以length的余数k = k%length,此时只需要将last继续移动length-k就可以获得旋转过后的头节点的前一个节点,接下来的操作同上。
讲的有点乱,可能代码会好些。
/**
* 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(head == null || head.next == null)
return head;
ListNode last = head;
ListNode first = head;
int length = 0;
for(int i = 0;i<k;i++)
{
if(last.next == null)
{
length = i+1;
k = length - k%length;
last.next = head;
break;
}
last = last.next;
}
if(length != 0)
{
while(k > 0)
{
last = last.next;
k--;
}
head = last.next;
last.next = null;
}
else
{
while(last.next != null)
{
first = first.next;
last = last.next;
}
last.next = head;
head = first.next;
first.next = null;
}
return head;
}
}