• 【牛客网面试必刷】链表篇


     🤵‍♂️ 个人主页:       叶秋学长
    👨‍💻 作者简介:  全栈领域新星创作者
    🌐 推荐一款找工作神器网站:《牛客网》 |笔试题库|面试经验|实习招聘内推|

     📒 系列专栏:  《秋招面试题》
    🐋 希望大家多多支持😘一起进步呀!
    📝 如果文章对你有帮助的话,欢迎评论💬点赞👍收藏📂加关注

    前言:链表是数据结构中重要的一个章节,他的重要性也不言而喻,在未来不管是笔试还是面试都会遇到这类的题目,所以接下来我就会把一些链表的常考的题目全部整理出来供大家学习指正。

    一、学习刷题网站

    点击下面链接即可进行刷题学习
    开始刷题

    推荐的原因
    刷题网站何其多,但好的刷题网站却不多,以下几点就是我推荐的原因:
    1️⃣全面

    《牛客网》里面有很多资料,不管是刷题还是学习还是面经等等

    2️⃣大众

    首先用的人很多,可以看到很多的题解,其次如果有问题也会有很多人回答

    3️⃣熟悉oj环境

    我们以后找工作的时候很多公司都会用《牛客网》,我们可以提前熟悉环境

     二、刷题

    描述

    请你实现一个链表。
    操作:
    insert x y:将yy加入链表,插入在第一个值为xx的结点之前。若链表中不存在值为xx的结点,则插入在链表末尾。保证xx,yy为int型整数。
    delete x:删除链表中第一个值为xx的结点。若不存在值为xx的结点,则不删除。

    输入描述:

    第一行输入一个整数nn (1\le n \le 10^41≤n≤104),表示操作次数。
    接下来的nn行,每行一个字符串,表示一个操作。保证操作是题目描述中的一种。

    输出描述:

    输出一行,将链表中所有结点的值按顺序输出。若链表为空,输出"NULL"(不含引号)。

    示例1

    输入:5
            insert 0 1
            insert 0 3
            insert 1 2
            insert 3 4
            delete 4
    输出:
            2 1 3

    题解

    本题主要进行 在指定位置插入节点 以及 删除指定位置节点 的链表操作的模拟(本题解使用带头节点的链表)

    首先在结构体中定义用于存储节点数据的data和用于指向下一个节点的结构体指针next

    对于插入操作,需要在第一次出现指定值的节点之前的位置进行节点的插入,因此需要两个指针,p指针向后遍历链表寻找指定值节点,q指针跟随在p指针之前,以便于新节点的插入。当p指针找到指定值节点或为空时,便new一个新节点,将其插入到q节点之后即可。

    对于删除操作,与插入操作类似,依然需要pq两个指针,当p指针找到指定位置后,将q指针的next指向p指针的next,然后将p指针的next置空,即可delete p,达到删除指定位置节点的要求。

    我的解题思路如下:

    1. #include<iostream>
    2. using namespace std;
    3. struct List
    4. {
    5. int data;
    6. List* next;
    7. };
    8. void insert(List* p, int x, int y) // 在指定位置插入节点
    9. {
    10. List* q = p;
    11. p = p->next;
    12. while(p != NULL)
    13. {
    14. if(p->data == x)
    15. {
    16. break;
    17. }
    18. q = p;
    19. p = p->next;
    20. }
    21. List* t = new List();
    22. t->data = y;
    23. q->next = t;
    24. t->next = p;
    25. }
    26. void del(List* p, int x) // 删除指定位置节点
    27. {
    28. List* q = p;
    29. p = p->next;
    30. while(p != NULL)
    31. {
    32. if(p->data == x)
    33. {
    34. q->next = p->next;
    35. p->next = NULL;
    36. delete p;
    37. return ;
    38. }
    39. q = p;
    40. p = p->next;
    41. }
    42. }
    43. int main()
    44. {
    45. int n;
    46. cin>>n;
    47. List* head = new List();
    48. head->next = NULL; // 创建带头节点的链表
    49. for(int i = 0; i < n; i++)
    50. {
    51. string op;
    52. cin>>op;
    53. if(op == "insert")
    54. {
    55. int x, y;
    56. cin>>x>>y;
    57. insert(head, x, y);
    58. }
    59. if(op == "delete")
    60. {
    61. int x;
    62. cin>>x;
    63. del(head, x);
    64. }
    65. }
    66. List* f = head->next; // 因为带头节点,因此需要从head->next开始遍历链表
    67. if(f == NULL)
    68. {
    69. cout<<"NULL";
    70. }
    71. while(f != NULL)
    72. {
    73. cout<<f->data<<" ";
    74. f = f->next;
    75. }
    76. return 0;
    77. }

    点击右下方的自测运行,查看结果:

    结果无误,点击保存并提交~~ 

    这样就成功刷完一道算法题,学长亲测非常好用的《牛客网》刷题神器,还不赶快跟着学长一起卷起来~~

  • 相关阅读:
    菜鸟、小白在autojs和冰狐智能辅助之间如何选择?
    NIFI同步API接口数据
    【业务功能118】微服务-springcloud-springboot-Kubernetes集群-k8s集群-KubeSphere-OpenELB部署及应用
    开源啦!一键部署免费使用!Kubernetes上直接运行大数据平台!
    视觉信息处理与FPGA实现第八次作业——verilog实现亮度调节
    PHP入门教程5:会话管理和数据库操作
    Sensor简介(一):摄像头模组CCM的结构和原理简述
    五、点击切换、滚动切换、键盘切换
    paddlenlp进行训练UIE-X相关问题
    HFI-脉振法
  • 原文地址:https://blog.csdn.net/m0_63722685/article/details/126448968