《五月集训》第十二天——单链表

《五月集训》第十二天——单链表,第1张

文章目录
  • 前言
  • 💎一、题目一
    • 🏆1.题目描述
    • 🏆2.解题思路
    • 🏆3.代码详解
  • 💎二、题目二
    • 🏆1.题目描述
    • 🏆2.解题思路
    • 🏆3.代码详解
  • 💎三、题目三
    • 🏆1.题目描述
    • 🏆2.解题思路
    • 🏆3.代码详解
  • 💎四、题目四
    • 🏆1.题目描述
    • 🏆2.解题思路
    • 🏆3.代码详解
  • 💎五、星球推荐


前言

        单链表中的每个结点不仅包含值,还包含链接到下一个结点的 引用字段。通过这种方式,单链表将所有结点按顺序组织起来。
        刷题坚持每一天.
        以下题目引用自:力扣(LeetCode)

💎一、题目一 🏆1.题目描述

原题链接:1290. 二进制链表转整数

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

示例 1:
输入:head = [1,0,1]
输出:5
解释:二进制数 (101) 转化为十进制数 (5)

🏆2.解题思路

🔑思路:
​         每读取链表的一个节点值,看作当前二进制数的最低位,当读到下一个节点值的时候,把已经读到的结果乘以 2做进位,再将新读到的节点值当作当前二进制数的最低位,循环进行下去,直到读到了链表的末尾。

🏆3.代码详解
int getDecimalValue(struct ListNode* head){
    int ans = 0;
    while(head){
        ans = ans*2 + head -> val;
        head = head -> next;
    }
    return ans;
}

💎二、题目二 🏆1.题目描述

原题链接:237. 删除链表中的节点

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

示例 1:

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

🏆2.解题思路

🔑思路:

​         把下一节点值放到当前节点值里。当前节点跨过下一节点链接到下下节点。

🏆3.代码详解
void deleteNode(struct ListNode* node) {
    node->val = node->next->val;
    node->next = node->next->next;
    return node;
}

💎三、题目三 🏆1.题目描述

原题链接:剑指 Offer II 024. 反转链表

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

示例 1:

输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]

🏆2.解题思路

🔑思路:

​        把链表断开取出一个节点,把取出的节点链接到头节点,然后,头节点链接上其余部分。然后取出的节点更新为头节点,依次循环。

🏆3.代码详解
struct ListNode* reverseList(struct ListNode* head){
    if(head == NULL) return NULL;
    struct ListNode* nowh = head;
    struct ListNode* tran;
    struct ListNode* node = head->next;
    while(node){
        tran = node;
        node = node->next;
        head->next = node;
        tran->next = nowh;
        nowh = tran;
    }
    return nowh;
}

💎四、题目四 🏆1.题目描述

原题链接:1019. 链表中的下一个更大节点

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

示例 1:
输入:head = [2,7,4,3,5]
输出:[7,0,5,5,0]

🏆2.解题思路

🔑思路:

​         先把链表里的值取出放到数组,反向遍历这个数组,最后值先进栈,当前一个值小于栈顶值时,给结果值赋栈顶值,当前一个值大于栈顶值时,出栈并更新栈顶值。

🏆3.代码详解
int* nextLargerNodes(struct ListNode* head, int* returnSize){
    int temp[10000];
    int count = 0;
    int i, top = 0;
    while(head){
        temp[count++] = head->val;
        head = head->next;
    }
    *returnSize = count;
    int* ans = (int*)malloc(sizeof(int)*count);
    int* stack = (int*)malloc(sizeof(int)*count);
    for(i = count-1; i >= 0; --i){
        while(top != 0 && stack[top-1] <= temp[i]){
            top--;
        }
        ans[i] = top==0 ? 0 : stack[top-1];
        stack[top++] = temp[i];
    }
    free(stack);
    return ans;
}

💎五、星球推荐

        星球链接:英雄算法联盟

星球里有什么?
        【朋友圈】一个极致精准的自律、编程、算法的小圈子。
        【算法集训】以月为单位组织算法集训,每天四题,风雨无阻。
        【排行榜】每天、每周都会有榜单,激励大家不断进步,不断成长。
        【个人规划】每个人都写好自己的规划,也可以查看他人的规划,时刻警醒自己不掉队。
        【打卡挑战】每日一题打卡、每日早起打卡、算法集训打卡、规划完成情况打卡。
在星球里做什么?
        目前星球人数达到400+,在星球里你能够遇到一群志同道合之人,因为都是花钱进来的,你不会看到任何浑水摸鱼的人,每个人都有自己的每月规划,星主每月都会组织算法集训,每天一起刷题,你可以看到别人的解题报告,取其之长,补己之短。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/920666.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-16
下一篇 2022-05-16

发表评论

登录后才能评论

评论列表(0条)

保存