您的位置:首页 > 其它

Rotate List

2015-07-21 23:47 267 查看

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问题~~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息