【leetcode】Reverse Linked List II (Java)
2015-11-27 00:00
246 查看
Reverse Linked List II
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 = 2 and n = 4,
return
1->4->3->2->5->NULL.
Note:
Given m, n satisfy the following condition:
1 ≤ m ≤ n ≤ length of list.
题意大致是把一部分链表反转一下。这道题我竟然自己做出来了,撒花撒花~~~(但是不确定是否满足限制条件
解题思路:
我觉得这道题对我来说主要的问题在于在不断地变化next时,如何去保证不会丢失节点;还有就是in-place和in one-pass的限制。这道题画图做比较方便。先上代码(虽然效率还是不高):
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ public class Solution { public ListNode reverseBetween(ListNode head, int m, int n) { int index = 1; if(m == 1){ ListNode root = new ListNode(0); root.next = head; m = 2; n++; ListNode start = root; ListNode end = root; while(index<m-1){ start = end = start.next; index++; } end = end.next; while(index<n-1){ ListNode temp = start.next; start.next = end.next; end.next = end.next.next; start.next.next = temp; index++; } return root.next; }else{ ListNode start = head; ListNode end = head; while(index<m-1){ start = end = start.next; index++; } end = end.next; while(index<n-1){ ListNode temp = start.next; start.next = end.next; end.next = end.next.next; start.next.next = temp; index++; } return head; } } }
我把题目大致解析成下图的样子:
![](http://static.oschina.net/uploads/space/2015/1127/152958_mzKe_2526106.jpg)
可以看到涉及的修改在(m-1)到(n+1)节点之间,所以我首先(17~23行,33~39行)找到(m-1)的位置处,并且把(m-1)和m分别记作start和end节点。
在下图中大致分解了一次循环(25~29行,41~45行)的内容:
![](http://static.oschina.net/uploads/space/2015/1127/153002_rOjv_2526106.jpg)
start和end保持不变,并且把他们的next都向后移动一个节点,然而这样的挪动会导致有一个节点没有next可以用来访问他,所以我就把这个节点在最开始记录为temp,然后再反向过来。做n-m次即可,最开始的while中index是表示找到的(m-1),在后面的while只是为了作为限制条件(n-m+m-1),没有特殊意义。
最后就得到了结果,在m=1时,我新建了一个root节点虚拟(13~16行),最后返回root.next即可,过程与不从头开始相同。
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树
- [原创]java局域网聊天系统