单向链表题库2(c++)

目录

前言

接着上一个作品的题库,没学单向链表的先看我这个作品(蓝色字体点进去) ,再看题库1巩固知识,然后再看这个题库。

1.力扣------LCR 123. 图书整理 I

(蓝色字体点进去看原题)

代码题解

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:
    vector<int> reverseBookList(ListNode* head) {//这一题就是反转链表,也就是逆序输出链表
        vector<int> ans;//定义一个顺序表用于返回逆序输出的值
        while(head){
            ans.push_back(head->val);
            head=head->next;
        }
        int l=0,r=ans.size()-1;//一定要注意顺序表是从下标0开始的所以最后一个下标是长度减一
        while(l<r){//逆序输出就相当于对称换值
            int t=ans[l];
            ans[l]=ans[r];
            ans[r]=t;
            l++,r--;//l往后跑,r往前跑
        }
        return ans;
    }
};

2.力扣------LCR 024. 反转链表

代码题解

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* reverseList(ListNode* head) {
        if(!head||!head->next)return head;//递归出口,如果链表头结点为空或者只有一个节点就返回head
        ListNode*newHead=reverseList(head->next);//newHead用于每层反转链表之后的新头节点
        head->next->next=head;//反转链表以后head就不是头结点了是尾结点head->next看做newHead,newhead->next为head
        head->next=NULL;//因为head为尾结点所以head->next为空
        return newHead;
    }
};

3.力扣LCR 141. 训练计划 III

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* trainningPlan(ListNode* head) {
        if(!head||!head->next) return head;
        ListNode*newHead=trainningPlan(head->next);
        head->next->next=head;
        head->next=NULL;
        return newHead;
    }
};

4.力扣------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) {
        if(!head)return NULL;//递归出口
        head->next=removeNodes(head->next);//假定进行递归的时候得到一个单调不增的链表,返回这个链表的头结点
        if(head->next==NULL)return head;//然后让head与head->next(单调不增的链表头结点)比较如果head大返回head,反之返回head->next也就是移除了head
        if(head->val<head->next->val)return head->next;
        return head;
    }
};

5.力扣------2816. 翻倍以链表形式表示的数字

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 {
    void doDouble(ListNode*head,int* cap){//cap代表进位的值
        if(!head){//递归出口head为空也就是链表到尾部了
            *cap=0;//最后一位的进位肯定为0
            return ;
        }
        int val;
        doDouble(head->next,&val);
        *cap=(2*head->val+val)/10;//记录当前节点的进位        
        head->val=(2*head->val+val)%10;//记录当前节点翻倍后的值
    }
public:
    ListNode* doubleIt(ListNode* head) {
        int val;
        doDouble(head,&val);
        return val == 0 ? head : (new ListNode(val,head));//如果val为0也就是说最高位没有进位也就不用生成新的节点,否则生成新的节点保留进位的值返回即可
    }
};

结语

看完这几题,如果你还想刷更多有关单向链表的题,就去力扣题库分类查看数据结构单向链表的题,那么单向链表就告一段落了,下一个作品我会讲初级数据结构------栈。

想看更多内容可以关注我,看我作品,关注我让我们一起学习编程,希望大家能点赞关注支持一下,让我有持续更新的动力,谢谢大家

相关推荐
牛油果子哥q2 分钟前
哈希表经典刷题模型与布隆过滤器精讲,哈希查重、哈希计数、双哈希映射、误判原理与工业级落地应用
数据结构·算法·哈希算法·散列表
Cx330❀6 分钟前
【MySQL基础】详解MySQL数据类型:底层原理、越界测试与最佳实践
linux·开发语言·数据库·c++·mysql
星恒随风10 分钟前
C++ string 入门(一)
开发语言·c++·笔记·学习
旖-旎10 分钟前
《LeetCode 200 FloodFill 岛屿数量DFS解法》
c++·算法·深度优先·力扣·floodfill
2601_9618451516 分钟前
花生十三图推思维导图|图形推理|技巧
数据结构·算法·链表·贪心算法·排序算法·线性回归·动态规划
前进吧-程序员17 分钟前
反转链表完全指南:辅助容器、三指针、头插法
数据结构·c++·链表
我不是懒洋洋20 分钟前
从零实现一个分布式配置中心:服务发现与热更新
c++
省四收割者22 分钟前
从硬件中断到分布式协程:全景解构高并发机制与 C / Golang 的巅峰对决
c++·分布式·嵌入式硬件·golang
Cx330❀26 分钟前
【Linux网络】从零定制应用层协议:黏包问题、全双工缓冲区与 Jsoncpp 序列化深度解析
linux·运维·服务器·开发语言·网络·c++·人工智能
程序猿零零漆30 分钟前
Python进阶之路:正则表达式、高级语法与核心数据结构(链表、二叉树)全解析
数据结构·python·正则表达式