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

刷题专练之链表(一)

文章目录

  • 前言
  • 一、 移除链表元素
    • 1.题目介绍
      • 2.思路
      • 3.代码
  • 二、反转链表
    • 1.题目介绍
    • 2.思路
    • 3.代码
  • 三、链表的中间结点
    • 1.题目介绍
    • 2.思路
    • 3.代码
  • 四、链表的中间结点
      • 1.题目介绍
      • 2.思路
      • 3.代码


前言

以下是链表经常考的面试题,我在这里进行归纳和讲解,采取的是循序渐进的方式y一一讲解
当然,需要有链表基础,没有的话先看我前面的链表讲解


一、 移除链表元素

1.题目介绍

题目在力扣得的203. 移除链表元素
在这里插入图片描述

2.思路

本题有两种思路

1.使用带有哨兵位的头结点
2.将头结点为空时和头删时两种情况分开写

3.代码

1.带哨兵位的头节点

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* removeElements(struct ListNode* head, int val){
    struct ListNode*dummyHead=(struct ListNode*)malloc(sizeof(struct ListNode));
    dummyHead->next=head;
    struct ListNode*prev= dummyHead;
    struct ListNode*cur=head;
    while(cur)
    {
        struct ListNode*temp=cur;
        if(cur->val==val)
        {
            struct ListNode*next=cur->next;
            prev->next=next;
        }
        else
        {
            prev=cur;  
        }
        cur=cur->next;   
    }
    return dummyHead->next;
}

2.不带哨兵位头节点的

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */

struct ListNode* removeElements(struct ListNode* head, int val){
    struct ListNode* prev=head;
    if(prev==NULL)
    {
        return head;
    }
    struct ListNode*cur=prev->next;
    while(cur)
    {
        if(prev->val==val&&prev->next!=NULL)//需要头删的情况,且之后有元素时
        {
            prev=prev->next;
            head=prev;
            cur=prev->next;
            
        }
        else if(cur->val==val)
        {
            prev->next=cur->next;
            cur=cur->next;
        }
        else if(cur->val!=val)
        {
            prev=cur;
            cur=cur->next;
        }
    }
    if(prev->val==val&&prev->next==NULL)//只有头节点的,而且需要头删的
    {
        head=NULL;
        return head;
    }
    return head;

}

二、反转链表

1.题目介绍

题目在206. 反转链表
在这里插入图片描述

2.思路

此题用三个指针,prev保存前面得节点的地址,cur保存当前的地址,同时cur也是需要改变next的节点,next保存cur下一个节点的地址
在这里插入图片描述
最后返回prev即可

3.代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


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

三、链表的中间结点

1.题目介绍

题目在力扣的876. 链表的中间结点

在这里插入图片描述

2.思路

如果你做过数组的双指针题,那么这题你就会很快的做出来,如果你不能很快的理解我的做法,你可以到前面的数组的刷题里面去看,双指针法你就会炉火纯青了,好了,就算你不了解双指针法,也很快的理解我的做法

我们可以用一慢指针和快指针,快指针的速度是慢指针的2倍,即慢指针每走一步,快指针就走两步,我们假设这个链表的长度为n,而快指针走完这个链表时,慢指针刚好就指向链表的中间的位置

3.代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


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

四、链表的中间结点

1.题目介绍

题目在牛客链表中倒数第k个结点
在这里插入图片描述

2.思路

如果你做过我前面的一个题目,那么这题就非常好理解了

我们可以搞两个指针,一个slow,一个fast,让fast先走k步,然后当fast走完时,slow就是倒数第k个节点

3.代码

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 * };
 */

/**
 * 
 * @param pListHead ListNode类 
 * @param k int整型 
 * @return ListNode类
 */
struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) {
    // write code here
    struct ListNode* fast=pListHead;
    struct ListNode* slow=pListHead;
    while(k--)
    {
        if(fast==NULL)
        {
            return NULL;
        }
        fast=fast->next;
    }
    while(fast)
    {
        fast=fast->next;
        slow=slow->next;
    }
    return slow;
}

相关文章:

  • Linux基础命令大全(上)
  • 总结:电容在电路35个基本常识
  • 2021电赛国一智能送药小车(F题)设计报告
  • 对于从事芯片行业的人来说,有哪些知识是需要储备的?
  • 【linux】Linux基本指令(上)
  • 拼多多24届暑期实习真题
  • 【JDK动态代理】及【CGLib动态代理】:Java的两种动态代理方式
  • MySQL数据同步到 Redis 缓存的几种方法
  • 一个nginx的小项目,不写代码,实现在局域网内访问其他电脑的网页
  • 基于Reactor模式下的epoll多路复用服务器
  • 为什么软件测试面试了几个月都没有offer,从HR角度分析
  • IO多路复用--[select | poll | epoll | Reactor]
  • java面试八股文之------Java并发夺命23问
  • 23.3.14打卡 2022年江西省大学生程序设计竞赛(正式赛)ABL
  • FPGA实现CSI-2 解码MIPI视频 2line 720P分辨率 OV5647采集 提供工程源码和技术支持
  • 深入了解以太坊
  • 【EOS】Cleos基础
  • canvas 绘制双线技巧
  • centos安装java运行环境jdk+tomcat
  • E-HPC支持多队列管理和自动伸缩
  • IDEA常用插件整理
  • Python学习之路16-使用API
  • use Google search engine
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 日剧·日综资源集合(建议收藏)
  • 如何在 Tornado 中实现 Middleware
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 想使用 MongoDB ,你应该了解这8个方面!
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • 如何正确理解,内页权重高于首页?
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ​业务双活的数据切换思路设计(下)
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • #### go map 底层结构 ####
  • #Lua:Lua调用C++生成的DLL库
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • $NOIp2018$劝退记
  • (+4)2.2UML建模图
  • (0)Nginx 功能特性
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (2024最新)CentOS 7上在线安装MySQL 5.7|喂饭级教程
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (C)一些题4
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (补)B+树一些思想
  • (二)正点原子I.MX6ULL u-boot移植
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (四)模仿学习-完成后台管理页面查询
  • (一)Thymeleaf用法——Thymeleaf简介
  • (译)计算距离、方位和更多经纬度之间的点
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • (转)甲方乙方——赵民谈找工作