Reverse Linked List II 单向链表逆序(部分逆序)
0 问题描述
将单向链表第m个位置到第n个位置倒序连接。例如,
原链表:1->2->3->4->5, m=2, n =4
新链表:1->4->3->2->1
(注:最终的新链表记为head,过程中临时使用的一个链表头记为h)
1 基本思路
首先考虑整个链表的情况。见到单向链表的第一反应自然是轮询链表head中每个节点,轮询过程中按需要建立一个新链表h,每次访问一个节点,就将这个节点放在前一个访问的节点之后,这样便实现了倒序。
然后再考虑部分倒序。要部分倒序,便要找出这部分从哪里开始,从哪里结束,根据前面的方法将该部分倒序之后,将倒序后的部分链表链上其他部分。
2 单向链表逆序
假设有三个节点,其过程如图(1)所示。
第一步取出node1,新链头指向node1,node1->next指向空,其他部分不变;
第二步取出node2,新链头指向node2,node2->next指向前一个访问的节点(即node1);
第二步取出node3,新链头指向node3,node3->next指向前一个访问的节点(即node2);
从这个过程中可以看到几点:
这是一个循环过程。循环的次数=链表中节点的个数。
每个节点都访问了且只访问一次,因而时间复杂度是O(n)。
需要三个辅助变量。1、使用了一个临时链头h;2、观察第二步(图1-2),该步将node2->next指向了node1,因此需要使用变量(prev)将node1保存下来。3、同样观察第二步,该步中将node2和node3之间的联系断开了,但是在下一次操作中需要使用到node3,因此需要使用变量(next)将node3保存下来。
这部分也就是该问题的核心代码。
while (len--) {
next = p->next;
h = p;
h->next = prev;
prev = p;
p = next;
}

3 部分逆序
假设现在有五个节点,我们需要将节点1-3倒序。首先将1-3倒序,那么现在该如何将节点0、4和完成倒序后的链表连接起来?结合图容易想到,node0->next应指向node3;node1->next应指向node4(见图2-2)。
node0->next指向node3只需要将新链表头h赋给它;
node1->next指向node4需要在上一节第一步中将它指向node4.
图示采用的是一个特例,在一般情况下,我们需要找到pa->next连接新链表头h的pa,以及新链表尾部->next指向的pb(见图2-3)。寻找很简单,但必须要考虑特殊情况:如果m=1,即h就是我们最后需要得到的链表头head.

4 源代码
ReverseLinkedListII.c Github
Reverse Linked List II 单向链表逆序(部分逆序)的更多相关文章
- leetcode——Reverse Linked List II 选择链表中部分节点逆序(AC)
Reverse a linked list from position m to n. Do it in-place and in one-pass. For example: Given 1-> ...
- [LeetCode] 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-> ...
- lintcode 中等题: reverse linked list II 翻转链表II
题目 翻转链表 II 翻转链表中第m个节点到第n个节点的部分 样例 给出链表1->2->3->4->5->null, m = 2 和n = 4,返回1->4-> ...
- [LeetCode] 92. Reverse Linked List II 倒置链表之二
Reverse a linked list from position m to n. Do it in one-pass. Note: 1 ≤ m ≤ n ≤ length of list. Exa ...
- [LeetCode] 92. Reverse Linked List II 反向链表II
Reverse a linked list from position m to n. Do it in-place and in one-pass. For example:Given 1-> ...
- LeetCode 92. Reverse Linked List II倒置链表2 C++
Reverse a linked list from position m to n. Do it in one-pass. Note: 1 ≤ m ≤ n ≤ length of list. Exa ...
- [leetcode]92. Reverse Linked List II反转链表2
Reverse a linked list from position m to n. Do it in one-pass. Note: 1 ≤ m ≤ n ≤ length of list. Exa ...
- 92. Reverse Linked List II 翻转链表II
Reverse a linked list from position m to n. Do it in one-pass. Note: 1 ≤ m ≤ n ≤ length of list. Exa ...
- 92. 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-> ...
随机推荐
- 本周psp(11月17-23)
本周psp进度 11月19号 内容 开始时间 结束时间 打断时间 净时间 发布读书笔记 11:05 11:25 0 20m 看构建之法书 9:50 10:48 5m 53m 11月20号 内容 开始时 ...
- hdu 5927 Auxiliary Set
传送门 分析:感觉这道题有点意思.就写一篇mark一下吧. 现场比赛的时候去枚举了儿子用了线段树+dfs序,和预想的一样T了. 可以换一个想法,从儿子对父亲的贡献来思考. 在点中先假设一个节点的每一个 ...
- 关于app的具体实施
鉴于我们小组做的app是关于在线做题和游戏相融合的,所以,我会先学习UI设计,毕竟好的UI设计不仅会给用户耳目一新的体验,同时还会让用户愿意去包容一些小BUG,但如果你的软件做的非常好,功能提供的很全 ...
- 关于java中创建文件,并且写入内容
以下内容完全为本人原创,如若转载,请注明出自:http://www.cnblogs.com/XiOrang/ 前两天在项目中因为要通过http请求获取一个比较大的json数据(300KB左右)并且保存 ...
- Chome v42 支持Java
从ver42开始,Chrome默认禁用了NPAPI.可以去chrome://flags/#enable-npapi开启,但是google很有可能在9月从代码中彻底移除NPAPIFirefox也有这个意 ...
- struts下ajax提交与页面进行提示 返回值为null
@Override public String execute() throws Exception { if ("none".equals(task)) { ...
- iocp 小例子
2016-08-3116:44:09 server 端 /******************************************************************* aut ...
- spark发行版笔记9
感谢DT大数据梦工厂支持提供技术支持,DT大数据梦工厂专注于Spark发行版定制. 本期概览: 1 Receiver生命全周期 首先,我们找到数据来源的入口,入口如下 Receiver的设计是极其巧妙 ...
- 高手总结的“恋爱法”学习Linux系统,效果更好。
如果你恋爱了,那你一定非常喜欢她.了解她,知道她喜欢吃什么玩什么,知道她需要什么,在她生气的时候可以哄她开心,一切尽在你的手指中.那你想学好Linux吗?喜欢Linux吗?你懂她吗?你有喜欢Linux ...
- vector algorithm find
本来想着申请了博客园以后 我要写的博客都必须是有深度有内涵的...好吧 结果我只能说我想多了 还是得一步一步慢慢来 最近小学期的任务是要做一个学校食堂餐卡管理系统 有“严重拖延症”的我 果然 ...