五月集训 DAY12 【链表】

1290.二进制链表转整数

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

输入:head = [1,0,1]
输出:5
解释:二进制数 (101) 转化为十进制数 (5)
在这里插入图片描述

输入:head = [0]
输出:0

输入:head = [1]
输出:1

输入:head = [1,0,0,1,0,0,1,1,1,0,0,0,0,0,0]
输出:18880

输入:head = [0,0]
输出:0

  • 链表不为空。
    链表的结点总数不超过 30。
    每个结点的值不是 0 就是 1。
class Solution {
public:
    int getDecimalValue(ListNode* head) {
        int sum = 0;
        while(head){
            sum = sum * 2 + head->val;
            head = head->next;
        }
        return sum;
    }
};

解题思路:
(1)每次循环,sum的值都乘以2,而最后一次循环是2的0次幂,恰好所以不用乘以2。

在这里插入图片描述

class Solution {
public:
    int getDecimalValue(ListNode* head) {
        int sum = 0;
        int len = 0;
        int i = 0;
        ListNode* a = head;						//(1)
        while(a){
            len++;								//(2)
            a = a->next;
        }
        len = len - 1;
        a = head;								//(3)
        while(a){
            sum = sum + pow(2, len)*(a->val);	//(4)
            len--;
            a = a->next;
        }
        return sum;
    }
};

解题思路:
(1)建立一个结构体指针来储存头结点的位置。
(2)计算链表的长度
(3)注意此时a为最后一个节点,想再遍历就要把它重置,而长度减一代表不同位置,2的幂数。
(4)由于val的值有1有0,这样就可以算出来二进制的和。

在这里插入图片描述

237.删除链表中的节点

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

输入:head = [4,5,1,9], node = 5
输出:[4,1,9]
解释:指定链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9
在这里插入图片描述

输入:head = [4,5,1,9], node = 1
输出:[4,5,9]
解释:指定链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9
在这里插入图片描述

  • 链表中节点的数目范围是 [0, 5000]
  • -5000 <= Node.val <= 5000
class Solution {
public:
    void deleteNode(ListNode* node) {
       node->val = node->next->val;
       node->next = node->next->next;
    }
};

解题思路:
(1)链表只能访问下一个元素,我第一感觉就是要把前面的指针跳过当前指针直接指向后一个,可惜行不通。
(2)那么就把当前的元素变成后面的元素,然后把后面多余的元素给跳过去。(也就是说直接指向后面的后面)。

翻转链表

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

输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]
在这里插入图片描述

输入:head = [1,2]
输出:[2,1]
在这里插入图片描述

输入:head = []
输出:[]

  • 链表中节点的数目范围是 [0, 5000]
  • -5000 <= Node.val <= 5000
struct ListNode* Creatnode(int x){
    struct ListNode* node = (struct ListNode*)malloc(sizeof(struct ListNode));
    node->val = x;
    node->next = NULL;
    return node;
}
struct ListNode* reverseList(struct ListNode* head){
    struct ListNode* vxt = head;
    struct ListNode* a = NULL;
    struct ListNode* b = NULL;
    while(vxt){
        a = Creatnode(vxt->val);
        a->next = b;
        b = a;
        vxt = vxt->next;
    }
    return b;
}

解题思路:
(1)直接建立一个新的链表,采用尾插法,将原来的链表遍历一遍。

在这里插入图片描述

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

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

输入:head = [2,1,5]
输出:[5,5,0]
在这里插入图片描述

输入:head = [2,7,4,3,5]
输出:[7,0,5,5,0]
在这里插入图片描述

  • 链表中节点数为 n
  • 1 <= n <= 10^4
  • 1 <= Node.val <= 10^9

解题思路:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值