Leetcode中链表的rotate问题
这次我们来看看链表的rotate问题,先上题!
https://leetcode.com/problems/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步,比如给你链表:1->2->3->4->5->NULL并且k = 2,返回4->5->1->2->3->NULL。
问题分析
可以发现,和数组的旋转不一样,其实链表大部分的结构并没有被破坏,说白了比如上面的例子,1->2->3和4->5的结构还是保存着的,然后只是这两个串的位置调换了而已。
所以问题的关键是找到导数第k个元素,导数第k+1个元素,第一个元素,最后一个元素,然后:导数第k个元素->…->最后一个元素->第一个元素->…->导数第k+1个元素->NULL。
这样就可以的啦。
上代码:
public ListNode rotateRight(ListNode head, int k)
{
if(k == 0 || head == null)
{
return head;
}
ListNode theTemp = head;
//先计算链表的长度
int theLength = 0;
while(theTemp != null)
{
++theLength;
theTemp = theTemp.next;
}
k = k%theLength;
if(k == 0) return head;
//找倒数第k,k+1个元素,就是slow.next和slow啦
ListNode quickNode = head;
ListNode slowNode = head;
for(int i = 0; i < k; i++)
{
quickNode = quickNode.next;
}
while(quickNode.next != null)
{
quickNode = quickNode.next;
slowNode = slowNode.next;
}
ListNode toReturn = slowNode.next;
slowNode.next = null;
quickNode.next = head;
return toReturn;
}
接下来我们顺便看看一个灰常有趣的image的rotate问题~~~