栈练习--------从链表中移除节点(LeetCode 2487)

题目:LeetCode 2487

解法

cpp 复制代码
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* removeNodes(ListNode* head) {
        vector<ListNode*> stk;
        ListNode* demmy = new ListNode(1000000,head);
        stk.push_back(demmy);
        while(head){
            while(stk.back()->val<head->val){
                stk.pop_back();
            }
            stk.push_back(head);
            head = head->next;
        }
        for(int i=0;i<stk.size()-1;i++){
            stk[i]->next = stk[i+1];
        }
        stk.back()->next=NULL;//这个不用写,最终数组的栈顶元素一定是初始链表的尾节点,一定指向NULL。
        return demmy->next;//应返回的是链表节点而非数组
    }
};

这个题目让我意识到了,vector不仅可以构建顺序表来实现栈,而且可以构建链表来实现栈,因为不论是栈、顺序表还是链表,他们本质上都是数组,所以本质就是利用vector来构建数组,然后利用数组来模拟栈。

这个题目思路是,首先构建一个链表,即数据类型为节点(结构体指针)的数组,然后定义一个虚拟头节点,特点是不会被移除,所以必须比题目给出的节点数据域都大,然后我们将这个demmy入栈,随后利用while循环遍历链表,在遍历过程中实现以下操作:

cpp 复制代码
while(stk.back()->val<head->val){
      stk.pop_back();
}
      stk.push_back(head);

在这几行语句中,我们要实现的操作是,将每一个节点传入栈中,但是在这之前,让待传入节点与栈顶元素作比较,如果大于栈顶元素,则弹出栈顶元素,重复判断和弹出操作,来实现对小节点的移除,最终栈就会变成一个单调不增的链表。

然后利用while循环,使这个链表串联起来,即让每个节点的next指针指向后者,最后一个节点指向NULL,(最后一个节点一定指向NULL,不用单独操作,最终数组的栈顶元素一定是初始链表的尾节点,一定指向NULL。)

相关推荐
Tisfy18 分钟前
LeetCode 0301.删除无效的括号:二进制枚举 / 回溯
算法·leetcode·字符串·题解·回溯·括号匹配·二进制枚举
Nil20826 分钟前
leetcode 322零钱兑换
算法·leetcode·职场和发展
yi01141 分钟前
DAY24: LeetCode 167:两数之和 II|从暴力枚举到左右双指针
笔记·python·算法·leetcode·二分查找·双指针
木井巳41 分钟前
【BFS 解决拓扑排序】课程表
java·算法·leetcode·广度优先·宽度优先·推荐算法·图搜索算法
Logic1011 小时前
C语言/数据结构数位DP题解:平滑排列数字统计——区间内相邻位差不超过K的数字个数
c语言·数据结构·动态规划·时间复杂度·数位dp·算法题·前导零处理
程序员老陆1 小时前
C++ 多线程通信方式全景:从共享内存到结构化协调
开发语言·c++
yi0111 小时前
LeetCode 15:三数之和|排序 + 双指针,如何避免重复答案?
笔记·python·算法·leetcode·双指针
某不知名網友1 小时前
ROS2 核心通信:话题发布与订阅详解
开发语言·c++
C++ 老炮儿的技术栈1 小时前
char (*csConnectName)[256]; 和 char csConnectName [256] 有什么区别
java·c语言·开发语言·c++·人工智能·算法·c
大鹏说大话2 小时前
C++ STL 容器怎么选?vector、list、map、unordered_map 对比
开发语言·c++·list