五月集训(第十二日)链表

这篇博客介绍了四个关于链表的操作:如何将二进制链表转换为十进制数,如何在不访问头节点的情况下删除链表中的节点,如何反转链表,以及如何找到链表中每个节点的下一个更大节点。解题思路包括遍历、栈的应用和头插法,提供了相应的C++源码实现。
摘要由CSDN通过智能技术生成

一、1290. 二进制链表转整数

1.原题链接

1290. 二进制链表转整数

2.题目描述

        给你一个单链表的引用结点 head。链表中每个结点的值不是 0 就是 1。已知此链表是一个整数数字的二进制表示形式。请你返回该链表所表示数字的 十进制值 。

3.解题思路

        遍历链表,将值转化为十进制即可。

4.源码

class Solution {
public:
    int getDecimalValue(ListNode* head) {
        int sum=0;
        while(head){
            sum=sum*2+head->val;
            head=head->next;
        }
        return sum;
    }
};

二、237. 删除链表中的节点

1.原题链接

237. 删除链表中的节点

2.题目描述

        请编写一个函数,用于 删除单链表中某个特定节点 。在设计函数时需要注意,你无法访问链表的头节点 head ,只能直接访问 要被删除的节点 。题目数据保证需要删除的节点 不是末尾节点 。

3.解题思路

        脑筋急转弯题,要删除一个链表,把要删除的节点的下一个节点的值给要删除的节点,然后删除下一个节点即可

4.源码

class Solution {
public:
    void deleteNode(ListNode* node) {
        node->val=node->next->val;
        node->next=node->next->next;
    }
};

三、剑指 Offer II 024. 反转链表

1.原题链接

剑指 Offer II 024. 反转链表

2.题目描述

        给定单链表的头节点 head ,请反转链表,并返回反转后的链表的头节点。

3.解题思路

        运用头插法解题

4.源码

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        if(head==nullptr){
            return head;
        }
        ListNode* pre =nullptr;
        ListNode* cur =head;
        while(cur!=nullptr){
            ListNode* temp =cur->next;
            cur->next =pre;
            pre=cur;
            cur = temp;
        }
        return pre;
    }
};

四、1019. 链表中的下一个更大节点

1.原题链接

1019. 链表中的下一个更大节点

2.题目描述

        给定一个长度为 n 的链表 head;对于列表中的每个节点,查找下一个 更大节点 的值。也就是说,对于每个节点,找到它旁边的第一个节点的值,这个节点的值 严格大于 它的值。返回一个整数数组 answer ,其中 answer[i] 是第 i 个节点( 从1开始 )的下一个更大的节点的值。如果第 i 个节点没有下一个更大的节点,设置 answer[i] = 0 。

3.解题思路

        使用栈来解题,遍历栈,将每个栈的值和栈顶元素比较,如果比它大,就找到大的值,弹出栈顶,直到找不到为止。

4.源码

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

总结

        十二天,继续加油,链表还需要继续学习头插法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枏念

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值