vivo 部分链表反转
方法一:使用栈交换需要反转的数字
#include <iostream>
#include <stack>
#include "list.h"
using namespace std; void partreverse(ListNode* phead, int m, int n)
{
int count = 1;
ListNode* p = phead;
stack<ListNode*> s1;
if (m < 1 || n < 1)
return;
if (m > n)
{//保证m小于n
int temp = m;
m = n;
n = temp;
}
if (m == n)//两者相等不交换直接返回
return;
while (count < m && p != nullptr)
{
count++;
p = p->m_pNext;
}
ListNode* start = p;
int estart = m + (n - m) / 2 + 1;
while (count <n && p != nullptr)
{
count++;
p = p->m_pNext;
if (count >= estart)
{
if (p != nullptr)
s1.push(p);//后半部分进栈
else
return;//超出长度直接返回
}
}
while (!s1.empty())
{//依次交换
ListNode* cur = s1.top();
int temp = cur->m_nValue;
cur->m_nValue = start->m_nValue;
start->m_nValue = temp;
s1.pop();
start = start->m_pNext;
}
return;
} void Test1()
{
ListNode* pNode1 = CreateListNode(1);
ListNode* pNode2 = CreateListNode(2);
ListNode* pNode3 = CreateListNode(3);
ListNode* pNode4 = CreateListNode(4);
ListNode* pNode5 = CreateListNode(5); ConnectListNodes(pNode1, pNode2);
ConnectListNodes(pNode2, pNode3);
ConnectListNodes(pNode3, pNode4);
ConnectListNodes(pNode4, pNode5); PrintList(pNode1);
partreverse(pNode1, 2, 4);
PrintList(pNode1);
} int main(int argc, char* argv[])
{
Test1();
return 0;
}
方法二:直接反转需要反转的部分
#include <iostream>
#include "list.h"
using namespace std; void partreverse(ListNode* phead, int m, int n)
{
int count = ;
ListNode* p = phead;
if (m < || n < )
return;
if (m > n)
{//保证m小于n
int temp = m;
m = n;
n = temp;
}
if (m == n)//两者相等不交换直接返回
return;
while (count < m- && p != nullptr)
{
count++;
p = p->m_pNext;
}
ListNode* prev = p, *start = phead, *end = nullptr, *next = nullptr;
if (m == )
prev = nullptr;
if (prev != nullptr)
start = prev->m_pNext;
p = start;
for (count = m; count < n && p != nullptr;)
{
count++;
p = p->m_pNext;
}
end = p;
if (end != nullptr)
next = end->m_pNext;
else
return;//end为nullptr,超出链表长度
if(prev !=nullptr)
prev->m_pNext = end;//prev指向反转后的链表头
end->m_pNext = nullptr;
ListNode* rprve = start, *rcur = start->m_pNext, *rnext = rcur->m_pNext;
while (rcur != end)
{//指定范围内的链表反转
rcur->m_pNext = rprve;
rprve = rcur;
rcur = rnext;
if (rnext != nullptr)
rnext = rnext->m_pNext;
}
rcur->m_pNext = rprve;
start->m_pNext = next;
if (prev == nullptr)
phead = end;//链表头被反转
PrintList(phead);
return; } void Test1()
{
ListNode* pNode1 = CreateListNode();
ListNode* pNode2 = CreateListNode();
ListNode* pNode3 = CreateListNode();
ListNode* pNode4 = CreateListNode();
ListNode* pNode5 = CreateListNode(); ConnectListNodes(pNode1, pNode2);
ConnectListNodes(pNode2, pNode3);
ConnectListNodes(pNode3, pNode4);
ConnectListNodes(pNode4, pNode5); PrintList(pNode1);
partreverse(pNode1, , );
//PrintList(pNode1);
} int main(int argc, char* argv[])
{
Test1();
return ;
}
前面花太多时间导致后面的送分题01背包没时间做,我恨!
vivo 部分链表反转的更多相关文章
- 链表反转leetcode206
最近准备结束自己的科研生涯,准备要开始找工作了,准备在LEETCODE刷刷题...刷的前40题全部用python刷的,各种调包速度奇快,后被师哥告知这样没意义,于是准备开始回归C++,Python用的 ...
- 链表反转 (Multi-method)
链表反转是链表相关问题最基础的知识,做完LeetCode中LinkedList后才会有这种体会,因为ACM算法中不会涉及这一部分.解决这一问题有多种方法,在面试中面试官通常也会要求写出多种.包括sta ...
- java实现单链表反转
一.简介 经查阅,主要有两种方法实现链表反转,递归反转法和遍历反转法: 递归: 在反转当前结点之前先反转其后边的结点,即.从尾结点开始逆向反转各个节点的指针域指向: 遍历:从前往后反转各个结点的指针域 ...
- C++ 单向链表反转
单向链表反转,一道常见的面试题,动手实现下. #include "stdafx.h" #include <stdlib.h> struct Node{ int data ...
- c语言:链表排序, 链表反转
下面将实现链表排序的排序和遍历显示功能: 所定义的链表结构如下: head -> p1 -> p2 ->p3 ->....->pn; head的本身不作为数据节点,hea ...
- 【Java数据结构】Java数据结构之链表反转
我们都知道用C可以很简单的实现单链表反转,今天来学习下,在Java中如何实现链表反转. 思路很简单,定义一个类,这个类分成2块,一块是表示自身的标志,另外一个存储指向下一个元素的引用.通过互换相邻两个 ...
- [LeetCode] 链表反转相关题目
暂时接触到LeetCode上与链表反转相关的题目一共有3道,在这篇博文里面总结一下.首先要讲一下我一开始思考的误区:链表的反转,不是改变节点的位置,而是改变每一个节点next指针的指向. 下面直接看看 ...
- 单链表反转(Singly Linked Lists in Java)
单链表反转(Singly Linked Lists in Java) 博客分类: 数据结构及算法 package dsa.linkedlist; public class Node<E> ...
- 【easy】206. Reverse Linked List 链表反转
链表反转,一发成功~ /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; ...
随机推荐
- RocketMQ 源码分析 —— Message 发送与接收
1.概述 Producer 发送消息.主要是同步发送消息源码,涉及到 异步/Oneway发送消息,事务消息会跳过. Broker 接收消息.(存储消息在<RocketMQ 源码分析 —— Mes ...
- check cve
今天想检查一下 Gitlab 11.9.0 产品受哪些 cve 的影响.其实网上已经有很多网站可以查询产品的相关 cve,但就是粒度比较粗.我想在 cve 列表中筛选出特定的版本,已经特定的版本,比如 ...
- vue-cli3.0中使用 postcss-pxtorem
vue.config.js module.exports = { lintOnSave: true, css: { loaderOptions: { postcss: { plugins: [ req ...
- Flask开发系列之模板
Flask开发系列之模板 本文对<FlaskWeb开发:基于python的Web应用开发实战>模板一节做的总结. Jinja2模板引擎 模板 模板是一个包含响应文本的文件,其中包含用占位变 ...
- Xcode中常用的快捷键(原文链接http://www.cocoachina.com/ios/20141224/10752.html)
Xcode导航快捷键 1.工程导航器:Command+1 快速浏览代码.图片以及用户界面文件. 2.显示/隐藏导航器面板:Command+0 当你在对屏幕进行截图的时候可能会想要隐藏起与你感兴趣内容的 ...
- 53道Java线程面试题
53道Java线程面试题 下面是Java线程相关的热门面试题,你可以用它来好好准备面试. 1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序 ...
- 如何在通过脚手架create-react-app 创建的react项目中配置 less
首先感慨下 自己竟然有半年没登账户 ,干嘛去啦? 从刚接触vue 接手做两次版本之后 又让我这个小菜鸡 开始开发react项目,连react生命周期还没搞明白的时候 就开始进行第一版本的开发了,第一个 ...
- 【模板】AC自动机加强版
题目大意:给定 N 个模式串和一个文本串,求每个模式串在文本串中出现的次数. 题解:文本串在自动机上匹配的过程中,记录下自动机上每一个状态被访问的次数.对于访问到的节点 i,则状态 i 的后缀中存在的 ...
- java选做猜数字
程序设计思想 第一步:使用随机数生成1-100的数字 第二步:让用户输入数字 第三步:输入的数字与生成数字不同执行下一步,相同执行第五步 第四步:比较两数大小并输出结果,并返回第二步 第五步:输出猜对 ...
- Django报错 No module named 'django.templates'
前言 Django 模板报错了 修改方法: 将你的工程文件下(my_site)的settings.py中的TEMPLATES中的templates字段全部改为template, 亲测可用~^~