【算法】剑指offer-删除链表中重复的节点最小栈
文章目录
- 删除链表中重复的节点
- 最小栈
删除链表中重复的节点
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例
如,链表1->2->3->3->4->4->5 处理后为 1->2->5
/*
struct ListNode {int val;struct ListNode *next;ListNode(int x) :val(x), next(NULL) {}
};
*/
class Solution {public:ListNode* deleteDuplication(ListNode* pHead) {if(pHead == nullptr){return nullptr;}ListNode* vhead = new ListNode(0);//新建哨兵位头节点vhead->next = pHead;//哨兵位链接原链表ListNode* prev = vhead;ListNode* cur = pHead;//prev 在cur的前面while(cur){//如果当前cur指向的值==cur->next指向的值if(cur->next !=nullptr &&cur->val ==cur->next->val){//cur走到重复值的最后一个位置while(cur->next&&cur->val ==cur->next->val){cur = cur->next;}//跳出循环时,cur指向的就是重复值的最后一个位置prev->next = cur->next;//prev链接cur的下一个节点cur = cur->next;//cur往后走}else{//prev和cur一起往后走//prev到cur的位置,此时cur位置的值一定是不重复的//prev始终指向的是不重复的位置prev = cur;cur = cur->next;}}return vhead->next;}
};
最小栈
定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)).
注意:保证测试中不会当栈为空的时候,对栈调用pop()或者min()或者top()方法.
题目已经说明:pop、top 和 min 函数操作时,栈中一定有元素
方法1:
我们使用一个辅助栈,内部保存元素的个数和数据栈完全一样,不过,辅助栈内部永远保存本次入栈的数为
所有数据的最小值(注意**:辅助栈内部元素可能会出现“必要性”重复**)
入栈:
- 最小栈为空 || 最小栈的栈顶元素大于当前入栈元素 -> 压入当前元素到最小栈
- 否则重复压入最小栈的栈顶元素
出栈:
- 直接Pop掉最小栈的栈顶元素
class Solution {public:void push(int value) {stPush.push(value);//如果最小栈为空 || 最小栈的栈顶元素大于当前入栈元素if(stMin.empty() || stMin.top()>=value){stMin.push(value);}else{//重复压入最小栈的栈顶元素stMin.push(stMin.top()); }}void pop() {stMin.pop();stPush.pop();}int top() {return stPush.top();}int min() {return stMin.top();}
private:stack<int> stPush;stack<int> stMin;//最小栈,辅助栈
};
方法2:方法1的优化版本
入栈:最小栈为空 || 最小栈的栈顶元素大于当前入栈元素 :才放到最小栈中
出栈:当前出栈数据和最小栈的栈顶元素相同才Pop掉,否则不处理最最小栈的栈顶元素
class Solution {public:void push(int value) {stPush.push(value);//如果最小栈为空 || 最小栈的栈顶元素大于当前入栈元素if(stMin.empty() || stMin.top()>=value){stMin.push(value);}}void pop() {if(stMin.top() == stPush.top()){stMin.pop();}stPush.pop();}int top() {return stPush.top();}int min() {return stMin.top();}
private:stack<int> stPush;stack<int> stMin;//最小栈,辅助栈
};
【算法】剑指offer-删除链表中重复的节点最小栈相关推荐
- python实现剑指offer删除链表中重复的节点
题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后 ...
- 剑指offer.删除链表中重复的节点
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留. 样例1 输入:1->2->3->3->4->4->5输出:1->2-> ...
- 力扣—— 19. 删除链表的倒数第 N 个结点(java)、剑指 Offer 22. 链表中倒数第k个节点(java)
19. 删除链表的倒数第 N 个结点(java) 一.题目描述 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点. 进阶:你能尝试使用一趟扫描实现吗? 输入:head = [1,2,3 ...
- 【每日一题】剑指 Offer 22. 链表中倒数第k个节点
剑指 Offer 22. 链表中倒数第k个节点
- 【LeetCode】剑指 Offer 22. 链表中倒数第k个节点
[LeetCode]剑指 Offer 22. 链表中倒数第k个节点 文章目录 [LeetCode]剑指 Offer 22. 链表中倒数第k个节点 一.遍历 二.双指针 总结 一.遍历 先遍历统计链表长 ...
- 面试题18: 删除链表节点:删除链表中重复的节点
/******************************************************************* *<剑指Offer--名企面试官精讲典型编程题>C ...
- python删除链表中重复的节点_Java编程删除链表中重复的节点问题解决思路及源码分享...
一. 题目 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 二. 例子 输入链表:1->2->3->3->4->4-&g ...
- python删除链表中重复的节点_剑指offer:删除链表中重复的节点
题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后 ...
- 《剑指offer》删除链表中重复的节点
题目:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 ...
最新文章
- linux终端 多标签,Linux有问必答:如何在 Ubuntu 15.04 的 GNOME 终端中开启多个标签...
- Adapter适配器设计模式
- Redis 基本操作
- python入门if语句练习_python入门视频:09 if语句_练习.mp4
- JavaScript高级之构造函数和原型
- 大横琴科技联合阿里云发布全国首个跨境服务创新平台琴澳通
- 5招训练你的数据敏感度,数据高手都在用
- linux mysql 不区分大小写,Linux下设置MySQL不区分大小写_MySQL
- rocketmq 几种队列_进阶必看的 RocketMQ ,就这篇了
- C# 数组拷贝 byte数组拷贝,char数组拷贝
- 圣诞老人python代码_用Python画圣诞老人的N种方法
- 自定义DatetimePicker起始默认值
- 2022金属非金属矿山(露天矿山)安全管理人员考试练习题模拟考试平台操作
- jvm原理与性能调优
- contentprovider与resolver使用
- web课程设计网页规划与设计----公司官网带轮播图 (页面精美 1页)
- 计算机组成原理经典复习题集锦(附答案)
- matlab动态神经网络进行时间序列预测分析
- 用计算机打出刚好遇见你,【计算机·故事】刚好遇见你 余生都是你
- ATX安装及简单使用