[LeetCode]92.Reverse Linked List II

2024-02-19 03:48
文章标签 leetcode ii list linked reverse 92

本文主要是介绍[LeetCode]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->2->3->4->5->NULLm = 2 and n = 4,

return 1->4->3->2->5->NULL.

Note:
Given mn 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;}
};


这篇关于[LeetCode]92.Reverse Linked List II的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/723403

相关文章

-bash: /bin/mv: Argument list too long mv

把labels下的所有文件mv到img文件夹下: mv labels/* img/ 报错: -bash: /bin/mv: Argument list too long  mv # Using find ... -exec + find folder2 -name '*.*' -exec mv --target-directory=folder '{}' +   # Using xar

LeetCode--231 2的幂

题目 给定一个整数,编写一个函数来判断它是否是 2 的幂次方。 示例 示例 1:输入: 1输出: true解释: 20 = 1示例 2:输入: 16输出: true解释: 24 = 16示例 3:输入: 218输出: false class Solution {public:bool isPowerOfTwo(int n) {if (n <= 0) return fals

LeetCode--234 回文链表

题目 请判断一个链表是否为回文链表。 示例 示例 1:输入: 1->2输出: false示例 2:输入: 1->2->2->1输出: true /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val

LeetCode--220 存在重复元素 III

题目 给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使得 nums [i] 和 nums [j] 的差的绝对值最大为 t,并且 i 和 j 之间的差的绝对值最大为 ķ。 示例 示例 1:输入: nums = [1,2,3,1], k = 3, t = 0输出: true示例 2:输入: nums = [1,0,1,1], k = 1, t = 2输出: true示例

LeetCode--217 存在重复元素

题目 给定一个整数数组,判断是否存在重复元素。如果任何值在数组中出现至少两次,函数返回 true。如果数组中每个元素都不相同,则返回 false。 示例 示例 1:输入: [1,2,3,1]输出: true示例 2:输入: [1,2,3,4]输出: false示例 3:输入: [1,1,1,3,3,4,3,2,4,2]输出: true class Solution {p

LeetCode--214 最短回文串

题目 给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。 示例 示例 1:输入: "aacecaaa"输出: "aaacecaaa"示例 2:输入: "abcd"输出: "dcbabcd" 思路: 我们需要添加多少个字符与给定字符串的前缀子串回文的长度有关. 也就是说去掉其前缀的回文子串,我们只需要补充剩下的子串的逆序

LeetCode--206 反转链表

题目 反转一个单链表。 示例 示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL class Solution {public:ListNode* reverseList(ListNode* head) {if (head == nullptr || head->next == nullptr){return head;}ListNo

LeetCode--204 计数质数

题目 统计所有小于非负整数 n 的质数的数量。 示例 示例:输入: 10输出: 4解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。 class Solution {public:int countPrimes(int n) {if (n <= 2) return 0;int cnt = 0;vector<bool> isPrime(n, true);

LeetCode--198 打家劫舍

题目 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。 示例 示例 1:输入: [1,2,3,1]输出: 4解释: 偷窃 1 号房屋 (金额 =

LeetCode--171 Excel表列序号

题目 给定一个Excel表格中的列名称,返回其相应的列序号。例如,A -> 1B -> 2C -> 3...Z -> 26AA -> 27AB -> 28 ... 示例 示例 1:输入: "A"输出: 1示例 2:输入: "AB"输出: 28示例 3:输入: "ZY"输出: 701 class Solution {public:int titleToNumber(strin