栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

五月集训-12【链表】

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

五月集训-12【链表】

文章目录
  • 前言
  • 一、练习题目
  • 二、思路及题解
    • 1. LC1290-二进制链表转整数
    • 2. LC237-删除链表中的节点
    • 3. LC206-反转链表
    • ^*^4. LC1019-链表中的下一个更大节点
  • 总结


前言

        欢迎大家积极在评论区留言一起讨论交流,知无不言,言无不尽,共同进步。本文是 链表 专题,更多其他专题内容详见《LeetCode每月集训系列》


一、练习题目
题目链接难度备注
1290. 二进制链表转整数★☆☆☆☆
237. 删除链表中的节点★☆☆☆☆
206. 反转链表★★☆☆☆
1019. 链表中的下一个更大节点★★★☆☆
二、思路及题解 1. LC1290-二进制链表转整数

方法一:

(1)使用位运算计算二进制数,先读到的是二进制的低位。

代码如下:

class Solution {
public:
    int getDecimalValue(ListNode* head) {
        int sum = 0;
        while (head) {
            sum = (sum << 1 | head -> val);
            head = head -> next;
        }
        return sum;
    }
};
2. LC237-删除链表中的节点

方法一:

(1)由于无法访问头结点,因此需要转换一些思维,将下一个结点的值赋给要删除节点的值,然后删除下一个结点即可。

代码如下:

class Solution {
public:
    void deleteNode(ListNode* node) {
        node -> val = node -> next -> val;
        node -> next = node -> next -> next;
    }
};
3. LC206-反转链表

方法一:

(1)遍历链表,不断将当前节点的 next 指针改为指向前一个节点。

代码如下:

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode* temp;
        ListNode* cur = head;
        ListNode* pre = NULL;
        while(cur) {
            temp = cur->next;  // 暂存cur的下一个节点
            cur->next = pre;  // 翻转操作
            // 更新pre和cur指针
            pre = cur;
            cur = temp;
        }
        return pre;
    }
};
*4. LC1019-链表中的下一个更大节点

方法一:单调栈

(1)首先将链表中的所有元素都转移到一个 nums数组中;
(2)创建一个单调递增栈,栈中存储的是数组中元素的下标,从栈顶到栈底每个元素对应数组中的值是递增的;
(3)遍历 nums 数组,若栈为空,则直接将当前遍历元素的下标入栈;若栈不为空并且栈顶位置的元素小于当前遍历的元素,则说明栈顶位置的元素找到了它的下一更大节点值,直接在将要返回的数组中赋值即可。

代码如下:

class Solution {
public:
    vector nextLargerNodes(ListNode* head) {
        stack stk;
        vector temp;
        while(head != NULL){
            temp.push_back(head -> val);
            head = head -> next;  
        }
        
        vector res(temp.size(),0);
        for(int i = 0; i < temp.size(); ++i){
            while(!stk.empty() && temp[stk.top()] < temp[i]) {
                res[stk.top()] = temp[i];
                stk.pop();
            }
            stk.push(i);
        }
        return res;
    }
};

总结

        题目难不要怕,只要每个月的每一天都坚持刷题学习,总有一天会熟练掌握的。欢迎加入【知识星球|英雄算法联盟】与我们一同早起刷刷刷⛽️

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/926180.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号