[LeetCode]92.Reverse Linked List II
来源:互联网 发布:西服品牌知乎 编辑:程序博客网 时间:2024/04/28 03:02
【题目】
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满足以下条件:
1≤M≤N≤列表的长度。
【分析】
思路1:
前m-1个不变,从第m+1个到第n个,依次删除,用尾插法插入到第m-1个节点后面。
第一步把4节点删除放入2节点之后
第二步把5节点删除放入2节点之后
【代码1】
/********************************** 日期:2014-01-28* 作者:SJF0115* 题号: Reverse Linked List II* 来源:http://oj.leetcode.com/problems/reverse-linked-list-ii/* 结果:AC* 来源:LeetCode* 总结:**********************************/#include <iostream>#include <stdio.h>#include <algorithm>using namespace std;struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {}};class Solution {public: ListNode *reverseBetween(ListNode *head, int m, int n) { if(m > n || n < 0){ return head; } ListNode *tail,*p,*rTail,*pre = NULL; //添加虚拟头结点(便于反转全部) ListNode *beginNode = (ListNode*)malloc(sizeof(ListNode)); beginNode->next = head; pre = beginNode; int index = 1; //遍历前m-1个节点 while(pre != NULL && index < m){ pre = pre->next; index++; } tail = pre; rTail = pre->next; index = 1; //删除第m+1节点开始 while(index < (n-m+1) ){ //删除p节点 p = rTail->next; rTail->next = p->next; //尾插法 p->next = tail->next; tail->next = p; index++; } return beginNode->next; }};int main() { Solution solution; int A[] = {1,2,3,4,5,6,7,8,9}; ListNode *head = (ListNode*)malloc(sizeof(ListNode)); head->next = NULL; ListNode *node; ListNode *pre = head; for(int i = 0;i < 1;i++){ node = (ListNode*)malloc(sizeof(ListNode)); node->val = A[i]; node->next = NULL; pre->next = node; pre = node; } head = solution.reverseBetween(head->next,1,8); while(head != NULL){ printf("%d ",head->val); head = head->next; } return 0;}
【代码2】
class Solution {public: ListNode *reverseBetween(ListNode *head, int m, int n) { ListNode dummy(0); dummy.next = head; ListNode *preM, *pre = &dummy; for (int i = 1; i <= n; ++i) { //preM 第m-1个节点 if (i == m) preM = pre; if (i > m && i <= n) { //删除head节点 pre->next = head->next; head->next = preM->next; //尾插法 preM->next = head; head = pre; // head has been moved, so pre becomes current } pre = head; head = head->next; } return dummy.next; }};
2 0
- [LeetCode]206. Reverse Linked List&92. Reverse Linked List II
- LeetCode 206. Reverse Linked List && 92. Reverse Linked List II
- 92. Reverse Linked List II leetcode list
- [LeetCode]92.Reverse Linked List II
- LeetCode 92. Reverse Linked List II
- [Leetcode] 92. Reverse Linked List II
- LeetCode --- 92. Reverse Linked List II
- [leetcode] 92.Reverse Linked List II
- [leetcode] 92. Reverse Linked List II
- 92. Reverse Linked List II LeetCode
- leetcode 92. Reverse Linked List II
- Leetcode 92. Reverse Linked List II
- LeetCode 92. Reverse Linked List II
- [LeetCode] 92. Reverse Linked List II
- LeetCode *** 92. Reverse Linked List II
- Leetcode 92. Reverse Linked List II
- [Leetcode] 92. Reverse Linked List II
- 【LeetCode】92. Reverse Linked List II
- SynchronizationContext类--管理异步环境
- 基于事件驱动的lua--c/c++交互
- c/c++/java,函数调用的参数的传递方法
- 袜子没尿湿
- Tomcat的设置4——Tomcat的体系结构与设置基于端口号的虚拟主机
- [LeetCode]92.Reverse Linked List II
- 使用 yum 命令安装本地安装QQ
- 并查集的分析及应用
- CMS的比较研究
- uva 712 S-Trees
- ASP+ACCESS爆库原理和基本方法
- ZOJ-2732
- android-如何从Play.google.com上下载APK文件到电脑
- 最长公共子序列