当前位置: 首页 > news >正文

【C++】顺序表,链表,栈的练习(千万要会做)每日小细节007

我们前几天已经学过了线性表:顺序表,链表和栈,但是只有理论知识是绝对不够的,我给大家找了一些很经典的题目,一定要做到立马有思路哦

(如果还有小可爱没有看过我的顺序表,链表和栈的知识点说明,请看↓

顺序表

入门级别单链表

带头双向循环链表(进阶版本)

另外前一篇练习文章在下面,一定要把前一篇文章好好弄懂再看着一篇哦

顺序表,链表和栈的练习

目录

 1.链表


由于链表的知识很多,相关的好题更多,所以本文选取典中典的好题给大家把常见思路都见一见,并不能说包含所有但是学完肯定能应付很多题目

我们开始吧~~

1.链表

1.1翻转链表

其实完全不用遍历到最后一个节点,把最后的换成新头然后往前走

因为我们在之前在单链表学过,单链表的结构决定了他就是不能很好的“倒车”,非常麻烦,还需要考虑指向的问题

有点小伙伴说那就弄成双向,是一个办法,但是人家给你一个单链表你非要硬做成双向...

最好的方法

 从第一个链表经过我们的操作变成了下面这个

之后把tail(此时在NULL)变成cur,cur变成next保存的节点就可以了

(注意:这里tail一开始初始化成NULL并没有开辟空间所以空间复杂度还是O(1))

struct ListNode* reverseList(struct ListNode* head){
struct ListNode*tail=NULL,*cur=head,*next=head;
while(cur)
{
    next=cur->next;
    cur->next=tail;
    tail=cur;
    cur=next;
}
return tail;
}

1.2 寻找中间节点

 这个看起来是不是立马想到:分奇数偶数!!先把链表遍历然后记录节点个数返回个数/2的节点!!!

struct ListNode* middleNode(struct ListNode* head){
struct ListNode*tail=head;
int count=0;
while(tail)
{
count++;
tail=tail->next;
}

    for(int i=0;i<count/2;i++)
{
head=head->next;
}
return head;

}

这样做肯定可以啊,也很简洁

但是我们不能局限于写出来和我只能想到...

更优化的办法:快慢指针

快指针一次走两步,慢指针一次走一步,这样听起来好玄乎,举个例子看看

 发现所有可能出现的情况都包含在内,如果本身链表为空,那slow自然就是NULL返回也直接是NULL

struct ListNode* middleNode(struct ListNode* head){
struct ListNode*fast=head,*slow=head;
while(fast&&fast->next)
{
    fast=fast->next->next;
    slow=slow->next;
}
return slow;
}

1.3返回倒数第n个节点 

 根据上一个题目的思路,只需要每次fast先走k个,如果在走的过程中有fast==NULL,那么直接返回NULL,然后再fast和slow各走一步就可以了

struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) {
    // write code here
    int count=0;
    struct ListNode*slow=pListHead,*fast=pListHead;
 while(k--)
 {
     if(fast)
     {
         fast=fast->next;
     }
     else
     {
   return NULL;
     }
 }
    while(fast)
    {
        fast=fast->next;
        slow=slow->next;
    }
    return slow;
}

考虑到吸收效率的情况,今天还是只放三个题目,记得关注继续看下文哦~~ 

相关文章:

  • k8s编程operator——client-go基础部分
  • MySQL纯代码复习
  • 零基础入门学习Web开发:HTML篇(一)
  • 【云原生】docker 搭建ElasticSearch7
  • ubuntu安装openresty
  • 前端爱心代码跟个风
  • 【数据结构】C语言实现顺序栈 OJ题 —— 有效的括号
  • Hive笔记
  • 趣味益智小游戏 三子棋+五子棋 优化版(可任意选择棋盘大小)
  • MySQL : 彻底搞懂一条SQL的执行过程
  • 【成为红帽工程师】第三天 web服务器
  • 【Node.js实战】一文带你开发博客项目(API 对接 MySQL)
  • 鸿蒙开发套件全面升级,助力鸿蒙生态蓬勃发展
  • HTML期末大作业——游戏介绍(HTML+CSS+JavaScript) web前端开发技术 web课程设计网页规划与设计 Web大学生网页成品
  • 读书笔记:《高频交易员》
  • JavaScript 如何正确处理 Unicode 编码问题!
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • css布局,左右固定中间自适应实现
  • eclipse的离线汉化
  • JSDuck 与 AngularJS 融合技巧
  • node学习系列之简单文件上传
  • Python语法速览与机器学习开发环境搭建
  • uva 10370 Above Average
  • 从PHP迁移至Golang - 基础篇
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 对象管理器(defineProperty)学习笔记
  • 分享几个不错的工具
  • 关于List、List?、ListObject的区别
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 七牛云假注销小指南
  • 入门级的git使用指北
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 微信开源mars源码分析1—上层samples分析
  • 我这样减少了26.5M Java内存!
  • 小而合理的前端理论:rscss和rsjs
  • 学习JavaScript数据结构与算法 — 树
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • 交换综合实验一
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • ​如何防止网络攻击?
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • # include “ “ 和 # include < >两者的区别
  • #Linux(帮助手册)
  • #QT项目实战(天气预报)
  • #前后端分离# 头条发布系统
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (C)一些题4
  • (动态规划)5. 最长回文子串 java解决
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (六)vue-router+UI组件库
  • (排序详解之 堆排序)
  • (推荐)叮当——中文语音对话机器人