【LeetCode-面试算法经典-Java实现】【061-Rotate List(旋转单链表)】
2015-08-01 07:13
771 查看
【061-Rotate List(旋转单链表)】
【LeetCode-面试算法经典-Java实现】【所有题目目录索引】
原题
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->NULLand
k = 2,
return
4->5->1->2->3->NULL.
题目大意
向右旋转一个单链表,旋转k个位置,k非负数。解题思路
用一个辅助root结点连接到链表头,先找到要移动的第一个结点的前驱prev,再将prev后的所有结点接到root后面,再将组成一个旋转后的单链表。代码实现
链表结点类public class ListNode { int val; ListNode next; ListNode(int x) { val = x; } }
算法实现类
public class Solution { public ListNode rotateRight(ListNode head, int n) { if (head == null || n < 1) { return head; } ListNode root = new ListNode(0); root.next = head; ListNode p = root; ListNode q = root; int count = 0; for (int i = 0; i <=n; i++) { p = p.next; count++; if (p == null) { count--; // 链表中除头结点后数据个数 n = n % count; // 实际要位置的位数 // 为重新开始位移做准备 i = 0; p = head; } } // 找到第一个要交换的结点的前驱 // q为第一个要交换的结点的前驱 while (p != null) { p = p.next; q = q.next; } p = q; q = root; if (p != null && p.next != null) { // 有要位移的结点 ListNode node; while (p.next != null) { // 摘除结点 node = p.next; p.next = node.next; // 接上结点 node.next = q.next; q.next = node; q = node; // 最后一个移动的节点 } } return root.next; } }
评测结果
点击图片,鼠标不释放,拖动一段位置,释放后在新的窗口中查看完整图片。特别说明
欢迎转载,转载请注明出处【/article/1343414.html】
相关文章推荐
- 九章算法面试题78 有效回文串
- 硅谷IT企业面试风格漫谈 I - Start Up 面些啥?
- 找工作知识储备(3)---从头说12种排序算法:原理、图解、动画视频演示、代码以及笔试面试题目中的应用
- 黑马程序员----java基础String和stringbuffer总结
- PHP程序员的一生
- 面试题:在宏达杯足球联赛前,四个球迷有如下4个预测: 其中一个是假,则结论正确的是?
- 黑马程序员_Java基础:序列化(Serializable)与反序列化
- 面试题37_两个链表的第一个公共结点
- php5.3以后各版本的特性(主要是整理一下面试用的)
- 黑马程序员——IO流(一)
- 黑马程序员——反射
- 阿里算法工程师内推面试经历
- 面试之jsp、Servlet相关知识——生命周期, 区别等
- 黑马程序员——走进面向对象
- 黑马程序员---iOS基础---面向对象编程思想
- 学习与职业规划——机器学习的学习路径和职业规划(简单版)
- 工作小记(一)----面试总结
- 黑马程序员------OC ARC管理和Category
- 黑马程序员——String类
- (剑指Offer)面试题52:构建乘积数组