LeetCode92——Reverse Linked List II
2016-02-29 23:06
337 查看
LeetCode92——Reverse Linked List II
时间原因直接跳过一眼看去就很难的91题。。。言归正传,链表逆置的变形,数据结构上学得是全局逆置,这里是局部逆置。
原题
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.
代码分析
因为知道全局链表逆置,这里加了m和n,限制了逆置范围,就需要做一些修改,我的办法很粗暴:直接把m和n所表示范围的那段链表抠出来,对这段链表进行逆置,当然,抠之前要“保护现场”要记住抠出来部分的头结点的前一个位置,后尾节点的后一个位置,这样逆置后才能与原链表拼接嘛,这个过程有点类似于中断。
至于逆置算法,这个就比较简单了。
class Solution { public: ListNode* reverseBetween(ListNode* head, int m, int n) { if (m == 0 || n == 0) { return head; } //创建头结点 ListNode*p = new ListNode(0); p->next = head; head = p; p = p->next; //把需要逆置的部分“抠”出来 //并记录原链表的入口和出口 ListNode*enter = head;//原链表的入口 ListNode*exit = p;//原链表的出口 ListNode*last = NULL;//逆置部分的最后一个节点 ListNode*first = p;//逆置部分的头结点 int i = 0; while (i++ < n) { if (i < m) { enter = enter->next; first = first->next; } if (i == n) { last = exit; } exit = exit->next; } enter->next = NULL; last->next = NULL; //完成逆置 ListNode*pPre = first; ListNode*pCur = pPre->next; ListNode*pNext = NULL; while (pCur != NULL) { pNext = pCur->next; pCur->next = pPre; pPre = pCur; pCur = pNext; } //将原链表与逆置部分组装 first->next = exit; first = pPre; enter->next = first; return head->next; } };
相关文章推荐
- Java8中的 Default 方法
- CSS学习(三)-css边框样式(上)
- 4.接口
- 二位数组按某一个或多个字段值(升序/降序)排序
- 又是一年收获季
- Linux 用户和组
- 52jdss经典说说:生活处处是陷阱,在不知到的情况下也许你就陷入绝境、、、
- Spring In Action 第4版笔记-第一章-001架构
- 计划
- IOS(UI)_UINavigationBar(导航控制器)
- Android多线程断点下载
- STM32F40X启动过程
- 【iOS9系列】- CoreSportlight内容索引的使用
- Oracle和SQLSERVER实现主键自动增长
- 运行所选代码生成器时出错:无效指针(异常来自HRESULT:0x80004003(E_POINTER))
- git 用不同的邮箱配置不同的ssh
- 导航设计:8种移动APP导航设计模式
- 数据库中varchar和char的比较
- Linux服务器配置-jdk
- 基于协同过滤的推荐引擎