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问题~~~
相关文章推荐
- [C/C++]反转链表
- 动易2006序列号破解算法公布
- C#实现基于链表的内存记事本实例
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- C++实现汉诺塔算法经典实例