【LeetCode-面试算法经典-Java实现】【092-Reverse Linked List II(反转单链表II)】
2015-08-06 07:40
806 查看
【092-Reverse Linked List II(反转单链表II)】
【LeetCode-面试算法经典-Java实现】【所有题目目录索引】
原题
Reverse a linked list from position m to n. Do it in-place and in one-pass.For example:
Given
1->2->3->4->5->NULL,
m = 2and
n = 4,
return
1->4->3->2->5->NULL.
Note:
Given m, n satisfy the following condition:
1 ≤ m ≤ n ≤ lengthof list.
题目大意
给定一个单链表,将第m到第n个之间的元素进行转。给定的n和m都是合法的,使用原地方法进行解决(使用常量辅助空间)
解题思路
先找到第一个要反转的元素的前驱(prev),再计算要进行反转的元素个数,对元素进行头插法,插在prev后面,同时保持链表不断开。代码实现
链表结点类public class ListNode { int val; ListNode next; ListNode(int x) { val = x; } }
算法实现类
public class Solution { public ListNode reverseBetween(ListNode head, int m, int n) { ListNode root = new ListNode(0); ListNode p = root; root.next = head; for (int i = 1; i < m && p != null; i++) { p = p.next; } if (p != null) { ListNode q = p.next; ListNode r; // 如果m为负数就认为是从第一个开始交换 if (m < 1) { m = 1; } n = n - m + 1; // n为要换的结点数目 // 有两个结点时才要使用尾插法,尾插的个数为n-1 for (int i = 1; i < n && q.next != null ; i++) { // 为要进行尾插的结点 r = q.next; // 在q结点的后面进行尾插操作 q.next = r.next; r.next = p.next; p.next = r; } head = root.next; } return head; } }
评测结果
点击图片,鼠标不释放,拖动一段位置,释放后在新的窗口中查看完整图片。特别说明
欢迎转载,转载请注明出处【/article/1343399.html】
相关文章推荐
- 黑马程序员——Java基础---反射
- 黑马程序员——Java基础---异常&File
- 黑马程序员——Java基础---IO
- 黑马程序员---指向函数的指针与返回指针的函数
- 20150805面试有感
- 中年程序员的困惑
- Java程序员应该掌握哪些东西
- 保持好奇心,让程序员永远年轻
- Java笔试面试题001
- 新入行程序员应知的十个秘密
- SAP 实习 面试 工作 心得 体会记录
- 二叉树的分层遍历
- 黑马程序员-----java基础之数据类型和运算符
- 黑马程序员——java学习10(毕17)——工具类
- 【求职应聘】岗位职责与要求
- (剑指Offer)面试题57:删除链表中的重复结点
- 只有规范的格式才能体现出程序员清晰的思路
- (剑指Offer)面试题56:链表中环的入口结点
- 黑马程序员—JAVA基础—反射
- 黑马程序员—JAVA基础—io流