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-> ...
 
随机推荐
- 13 个免费的 PNG 图像的优化和压缩工具
			
图像格式有许多种不同类型,在互联网上最常见的有JPEG.GIF.BMP.TIFF和PNG.每一种图像格式都有它自己的用途,比如GIF是用于动画的,JPEG是用于高清图片的,这种图片在保存或者调整大小后 ...
 - android模拟器genymotion安装virtualbox不能为虚拟电脑启动一个新任务
			
错误详情如下: Unable to load R3 module C:\Program Files\Oracle\VirtualBox/VBoxDD.DLL (VBoxDD): GetLastErro ...
 - 使用CXF发布WebService
			
这里普及一下WebService和cxf的知识.关于webservice和cxf: WebService.各种提供服务的组件 .企业总线.通讯总线(ESB)CXF:是一个SOA框架,Axi ...
 - js动态替换数据的点击事件
			
做项目时遇到的,具体是界面如下图:当点击X号时,出现删除.取消按钮,当点击删除时,这一行删除,当点击取消时又恢复到初始状态. 需要关注的问题是,js动态添加的删除.取消按钮的点击事件.当点击取消时恢复 ...
 - uva 10271 (dp)
			
题意:有n个数据,给定k,要从中选出k+8个三元组(x,y,z,其中x<=y<=z),每选一次的代价为(x-y)^2,求最小代价和. [解题方法] 将筷子按长度从大到小排序 排序原因: 由 ...
 - 十天学会<div+css>横向导航菜单和纵向导航菜单
			
纵向导航菜单及二级弹出菜单 纵向导航菜单:一级菜单 <head><style type="text/css">body { font-family: Ver ...
 - js中正则表达式 ----  现成
			
1 . 校验密码强度 密码的强度必须是包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间. ^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$ 2. 校验中 ...
 - 论C#未来发展
			
近日M#的消息令江湖再次起了波澜.大家知道,.NET已经进入了瓶颈期.这个消息又让偶有所期待,趁此机会发表一下个人的展望,对C#或者其继任者,不管是M#还是X#. 一.语法特性 1. using引入类 ...
 - linux 安装mysql两种方式
			
yum -y install gcc gcc-c++ ncurses-devel cmake bison zlib zlib-devel libxml openssl dtrace ...
 - JAVA中最常用的十个快捷键
			
http://blog.sina.com.cn/s/blog_5fb39f910101dc2b.html 一个Eclipse骨灰级开发者总结了他认为最有用但又不太为人所知的快捷键组合.通过这些组合可以 ...