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->NULLm = 2 and n = 4,

return 1->4->3->2->5->NULL.

Note:
Given mn satisfy the following condition:
1 ≤ m ≤ n ≤ length of list.


题解:

如上图所示,几个重要的变量:

prev记录m位置前一个位置上的ListNode,当完成2~5这一段的反转后,prev的next指针要设置成反转后的序列的第一个指针;

head记录要反转的子列表的第一个ListNode;

kepeler记录要反转的子列表的最后一个ListNode;

有一种特殊的情况如下图所示:

当要反转的序列的第一个ListNode就是链表的头结点的时候,prev指针为空。这时候反转后的链表头节点变成上述kepeler所指向的节点,所以要在最后单独处理。

代码中21~25行的循环找到prev和head的位置,27~31行的循环找到kepeler的位置,33~39行的for循环将链表制定范围的链表反转。41行进行判断:反转后序列的头节点是否变成要反转的列表的最后一个节点——kepeler,如果是,返回kepeler,否则返回之前保存的原链表头结点。

 /**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode reverseBetween(ListNode head, int m, int n) {
int HeadNodes = 0;
ListNode answer = head;
ListNode prev = null; if(head == null || m >= n)
return answer; while(HeadNodes+1 < m){
prev = head;
head = head.next;
HeadNodes++;
} ListNode kepeler = head;
while(HeadNodes+1 < n){
kepeler = kepeler.next;
HeadNodes++;
} for(int i = 0;i < n-m;i++){
ListNode temp = head.next;
head.next = kepeler.next;
kepeler.next = head; head = temp;
} if(prev == null)
return kepeler;
else{
prev.next = kepeler;
return answer;
}
}
}

最新文章

  1. JAVA基础学习——1.0 Java概述
  2. AT指令调试程序
  3. HTML中超出文本使用省略号替代的CSS样式
  4. 让你的PHP程序真正的实现多线程(PHP多线程类)
  5. ios 写项目的时候遇到的问题及解决方案(1)
  6. Medusa: Gauges for JavaFX
  7. Lua标准库(转)
  8. 【转】C++析构函数为什么要为虚函数
  9. Android 应用启动速度优化
  10. 通过模板类简单实现Spark的JobServer
  11. DatePickerDialog 控制只选择年月或年或月
  12. vmware中的bridge、nat、host-only的区别
  13. CCF2013123最大的矩形(C语言版)
  14. 巧用CSS实现宝马LOGO
  15. MyGod--Beta版本前期报告
  16. qt 标签 QTextBrowser QLabel
  17. 《剑指offer》二叉树中和为某一值的路径
  18. php添加pdo_mysql.so的扩展
  19. 创建的vue项目出错的时候,提示This dependency was not found错误的处理方法
  20. 数据结构(C语言版)-第4章 串、数组和广义表

热门文章

  1. 【BZOJ3747】[POI2015]Kinoman 线段树
  2. EasyDSS+EasyNVR实现幼儿园直播/工地直播等分权限观看直播视频的功能
  3. python高级语法进阶
  4. intellij idea 自动生成setter getter
  5. Generally a good method to avoid this is to randomly shuffle the data prior to each epoch of training.
  6. picasso设置背景图片
  7. JAXB解析XML为对象
  8. ABAP制作密码输入框
  9. $.ajax()方法详解(转)
  10. linux基础part3