力扣算法题—092反转链表2

反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。

说明:
1 ≤ m ≤ n ≤ 链表长度。

示例:

输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL
 1 #include "_000库函数.h"
 2
 3
 4 struct ListNode {
 5     int val;
 6     ListNode *next;
 7     ListNode(int x) : val(x), next(NULL) {}
 8 };
 9
10
11 //只能扫描一遍
12 //将中间要反转的数取出来在放入链表中
13 class Solution {
14 public:
15     ListNode* reverseBetween(ListNode* head, int m, int n) {
16         if (!head || m <= 0 || n <= 0 || n <= m)return head;
17         //加头
18         ListNode*p = new ListNode(-1);
19         p->next = head;
20         head = p;
21
22         stack<int>s;
23         ListNode*pre = new ListNode(0);
24         while (p && n >0) {
25             --m;
26             if (m == 0)pre = p;
27             p = p->next;
28             if (p && m <= 0)
29                 s.push(p->val);
30             --n;
31         }
32         if (p == NULL)return head->next;//m,n超过了链表长度
33         pre->next = p->next;
34         while (!s.empty()) {
35             ListNode*q = new ListNode(0);
36             q->val = s.top();
37             q->next = pre->next;
38             pre->next = q;
39             pre = q;
40             s.pop();
41         }
42         return head->next;
43     }
44 };
45
46 //走一步反转一个数据
47 //不用对m,n的大小进行判断
48 class Solution {
49 public:
50     ListNode *reverseBetween(ListNode *head, int m, int n) {
51         ListNode *dummy = new ListNode(-1), *pre = dummy;
52         dummy->next = head;
53         for (int i = 0; i < m - 1; ++i) pre = pre->next;
54         ListNode *cur = pre->next;
55         for (int i = m; i < n; ++i) {//用交换法
56             ListNode *t = cur->next;
57             cur->next = t->next;
58             t->next = pre->next;
59             pre->next = t;
60         }
61         return dummy->next;
62     }
63 };
64
65
66 void T092() {
67     Solution s;
68     vector<int>v;
69     ListNode *head = new ListNode(0);
70     ListNode *p = head;
71     v = { 1,2,3,4,5 };
72     for (auto a : v) {
73         ListNode *q = new ListNode(0);
74         q->val = a;
75         p->next = q;
76         p = q;
77     }
78     p = head->next;
79     while (p) {
80         cout << p->val << "->";
81         p = p->next;
82     }
83     cout << endl;
84
85
86     p = s.reverseBetween(head->next, 2, 6);
87     while (p) {
88         cout << p->val << "->";
89         p = p->next;
90     }
91     cout << endl;
92 }

原文地址:https://www.cnblogs.com/zzw1024/p/10774806.html

时间: 2024-10-09 00:56:57

力扣算法题—092反转链表2的相关文章

力扣算法题—042接雨水

1 #include"000库函数.h" 2 //一点头绪都没有 3 //然后就自己按自己的意思来一遍 4 //好像没有用算法 5 //16ms,让我激动一把 6 7 class Solution { 8 public: 9 int trap(vector<int>& height) { 10 if (height.size() < 2)return 0; 11 int s = 0;//起始点 12 int e = 0;//终止点 13 int v = 0;/

力扣算法题—050计算pow(x, n)

1 #include "000库函数.h" 2 3 4 5 //使用折半算法 牛逼算法 6 class Solution { 7 public: 8 double myPow(double x, int n) { 9 if (n == 0)return 1; 10 double res = 1.0; 11 for (int i = n; i != 0; i /= 2) { 12 if (i % 2 != 0) 13 res *= x; 14 x *= x; 15 } 16 return

力扣算法题—064最小路径之和

给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小. 说明:每次只能向下或者向右移动一步. 示例: 输入: [   [1,3,1], [1,5,1], [4,2,1] ] 输出: 7 解释: 因为路径 1→3→1→1→1 的总和最小. 1 #include "_000库函数.h" 2 3 //使用Dijkstra算法 4 //即动态规划 5 class Solution { 6 public: 7 int minPathSum(vec

力扣算法题—460LFU缓存

[题目描述] 设计并实现最不经常使用(LFU)缓存的数据结构.它应该支持以下操作:get 和 put. get(key) - 如果键存在于缓存中,则获取键的值(总是正数),否则返回 -1. put(key, value) - 如果键不存在,请设置或插入值.当缓存达到其容量时,它应该在插入新项目之前,使最不经常使用的项目无效.在此问题中,当存在平局(即两个或更多个键具有相同使用频率)时,最近最少使用的键将被去除. 进阶: 你是否可以在 O(1) 时间复杂度内执行两项操作? 示例: LFUCache

力扣算法题—148sort-list

Sort a linked list in O(n log n) time using constant space complexity. Example 1: Input: 4->2->1->3 Output: 1->2->3->4 Example 2: Input: -1->5->3->4->0 Output: -1->0->3->4->5 Solution: 复杂度为O(nlogn)有快速排序,并归排序,堆排序,对

力扣算法题—147Insertion_Sort_List

Sort a linked list using insertion sort. A graphical example of insertion sort. The partial sorted list (black) initially contains only the first element in the list.With each iteration one element (red) is removed from the input data and inserted in

力扣算法题—048旋转图像

1 #include "000库函数.h" 2 3 //找位置规律 4 //先不按照规则,使用另一个矩阵 5 class Solution { 6 public: 7 void rotate(vector<vector<int>>& matrix) { 8 vector < vector<int>>v = matrix; 9 int n = matrix.size(); 10 for (int t = 0; t < 1; +

力扣算法题—062不同路径

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图中标记为“Finish”). 问总共有多少条不同的路径? 例如,上图是一个7 x 3 的网格.有多少可能的路径? 说明:m 和 n 的值均不超过 100. 示例 1: 输入: m = 3, n = 2 输出: 3 解释: 从左上角开始,总共有 3 条路径可以到达右下角. 1. 向右 -> 向右 -> 向下 2. 向右 -> 向下

力扣算法题—072编辑距离

给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 . 你可以对一个单词进行如下三种操作: 插入一个字符 删除一个字符 替换一个字符 示例 1: 输入: word1 = "horse", word2 = "ros" 输出: 3 解释: horse -> rorse (将 'h' 替换为 'r') rorse -> rose (删除 'r') rose -> ros (删除 'e') 示例 2: 输