C语言单链表OJ题(较易)

news2024/9/21 2:38:21

一、移除链表元素

leetcode链接

题目描述:

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。

思路:

正常遍历,找到value的值与题目中相同的结点去free掉,分为两种情况:

第一种就是头结点就是value值,直接将头节点指向next;

第二种情况就是第二个结点开始是value,需要有一个前结点指向value结点的下一个。

源码:

struct ListNode* removeElements(struct ListNode* head, int val)
{
    //链表本身为空
    if(head==NULL)
        return NULL;
    struct ListNode* prev = NULL;
    while(1)//头节点开始就是值
    {
        if(head->val==val)
        {
            prev=head;
            head=head->next;
            free(prev);
            if(head==NULL)
            {
                return NULL;
            }
        }
        else
        {
            break;
        }
    }
    struct ListNode* cur = head;
    while(cur)//从第二个开始才是value,可以使用prev,因为第一个不是value,可以存储
    {
        //这一部分卡了好久
        if(cur->val==val)
        {
            prev->next=cur->next;    
            struct ListNode* del=cur;
            free(del);
            cur=prev->next;
        }
        else
        {
            prev=cur;
            cur=cur->next;
        }
    }
    return head;
}

二、链表的中间结点

leetcode链接

题目描述:

给你单链表的头结点 head ,请你找出并返回链表的中间结点。

如果有两个中间结点,则返回第二个中间结点。

思路:

快慢指针法

进行一个循环,先让快指针走两步,然后让慢指针走一步,直到快指针指向空或者快指针的next指向空,这时候的慢指针就指向了中间结点,并且也满足第二个结点。

代码:

struct ListNode* middleNode(struct ListNode* head)
{
    //快慢指针,快指针走两步,慢指针走一步
    struct ListNode* slow = head;
    struct ListNode* fast = head;
    while(fast&&fast->next)
    {
        fast=fast->next->next;
        slow=slow->next;
    }
    return slow;
}

三、链表中倒数第k个结点

牛客网链接

题目描述:

输入一个链表,输出该链表中倒数第k个结点。

思路:

也是快慢指针的思想。

先让快指针走k步,然后再让快指针和慢指针一起走,直到快指针为空

这题有一些注意细节的点,比如k大于链表结点的个数,k==0,但这些都是小细节,主要思想还是快慢指针~

 代码:

struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) {
    // write code here
    if(pListHead==NULL||k==0)//k=0和链表为空的情况
    {
        return NULL;
    }
    struct ListNode* fast=pListHead;
    struct ListNode* slow=pListHead;
    while(k--)//先让快指针走k步
    {
        fast=fast->next;
        if(fast==NULL)
        {
            break;
        }
    }
    if(k>0)//k大于链表结点的个数的情况
    {
        return NULL;
    }
    while(fast)
    {
        fast=fast->next;
        slow=slow->next;
    }
    return slow;
}

四、反转链表

leetcode链接

题目描述:

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

思路:

顺序遍历链表,从第一个结点开始进行尾插,注意这里的尾插不是手撕单链表里面的pushback函数,而是应该将结点一个一个取下来。

相当于我们又学习了另外一种尾插的方式,不是直接改变头节点的值,而是将原有的头节点指向新的头节点。

代码:

struct ListNode* reverseList(struct ListNode* head)
{
    struct ListNode* newhead=NULL;
    struct ListNode* next=NULL;
    //头插
    while(head)
    {
        next=head->next;
        head->next=newhead;
        newhead=head;
        head=next;
    }
    return newhead;
}

 五、合并两个有序链表

leetcode链接

题目描述:

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

思路:

两个链表的第一个结点顺序比较,取小的尾插到一个新的头结点上,若一个提前结束,则将另一个直接尾插到新链表上

代码:

struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2)
{
    if(list1==NULL)
    {
        return list2;
    }
    if(list2==NULL)
    {
        return list1;
    }
    //取小的尾插
    //为何这题可以直接定义一个尾结点?
    struct ListNode* newhead=NULL;
    struct ListNode* tail=NULL;
    while(list1 && list2)
    {
        if(list1->val <= list2->val)
        {
            if(newhead==NULL)
            {
                newhead=tail=list1;
                //tail=newhead->next;
            }
            else
            {
                tail->next=list1;
                //tail=list1->next;
                tail=tail->next;
            }
            list1=list1->next;
        }
        else
        {
            if(newhead==NULL)
            {
                tail=newhead=list2;
                //tail=newhead->next;
            }
            else
            {
                tail->next=list2;
                tail=tail->next;
            }
            list2=list2->next;
        }
    } 
    if(list1)//剩余直接尾插
    {
        //tail=list1;
        tail->next=list1;
    }  
    if(list2)
    {
        //tail=list2;
        tail->next=list2;
    }
    return newhead;
}    

小心得:

在数据结构的新篇章里,注意的小细节更多,最好将能考虑的情况都要考虑到,不然调试起来比较麻烦。一般只有将头结点为空的情况下,直接赋值等于,其余一般都需要进行next链接。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/840662.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Statefulset 实战 3

上一部分我们说到如何使用 Statefulset 部署有状态的应用&#xff0c;Statefulset 可以做到部署的 每一个 pod 能够独立的拥有一个持久卷声明和持久卷 之前我们 用 Statefulset 和 ReplicaSet 对比&#xff0c;自然他们是有相似之处和不同之处&#xff0c;不同之处前面的文章已…

【云原生】K8S二进制搭建三:高可用配置

目录 一、部署CoreDNS二、配置高可用三、配置负载均衡四、部署 Dashboard 一、部署CoreDNS 在所有 node 节点上操作 #上传 coredns.tar 到 /opt 目录中 cd /opt docker load -i coredns.tar在 master01 节点上操作 #上传 coredns.yaml 文件到 /opt/k8s 目录中&#xff0c;部…

vue2-vue实例挂载的过程

1、思考 new Vue()这个过程中究竟做了什么&#xff1f;过程中是如何完成数据的绑定&#xff0c;又是如何将数据渲染到视图的等等。 2、分析 首先找到vue的构造函数。 源码位置&#xff1a;/src/core/instance/index.js options是用户传递过来的配置项&#xff0c;如data、meth…

通讯协议032——全网独有的OPC HDA知识一之聚合(一)

本文简单介绍OPC HDA规范的基本概念&#xff0c;更多通信资源请登录网信智汇(wangxinzhihui)。 本节旨在详细说明HDA聚合的要求和性能。其目的是使HDA聚合标准化&#xff0c;以便HDA客户端能够可靠地预测聚合计算的结果并理解其含义。如果用户需要聚合中的自定义功能&#xff…

Maven出现报错 ; Unable to import maven project: See logs for details错误的多种解决方法

问题现象; IDEA版本&#xff1a; Maven 版本 &#xff1a; 3.3.9 0.检查 maven 的设置 &#xff1a;F:\softeware\maven\apache-maven-3.9.3\conf 检查setting.xml 配置 本地仓库<localRepository>F:\softeware\maven\local\repository</localRepository>镜像…

观察者模式(C++)

定义 定义对象间的一种一对多(变化)的依赖关系&#xff0c;以便当一个对象(Subject)的状态发生改变时&#xff0c;所有依赖于它的对象都得到通知并自动更新。 ——《设计模式》GoF 使用场景 一个对象&#xff08;目标对象&#xff09;的状态发生改变&#xff0c;所有的依赖对…

信息论之从熵、惊奇到交叉熵、KL散度和互信息

一、熵&#xff08;PRML&#xff09; 考虑将A地观测的一个随机变量x&#xff0c;编码后传输到B地。 这个随机变量有8种可能的状态&#xff0c;每个状态都是等可能的。为了把x的值传给接收者&#xff0c;需要传输⼀个3⽐特的消息。注意&#xff0c;这个变量的熵由下式给出: ⾮…

掌握主动权:职场中如何主动寻找并拓宽工作领域

引言 在现代职场的竞争环境中&#xff0c;主动性是一种重要的优势。对于企业而言&#xff0c;员工的主动性是其成功的关键因素之一。而对于个人职业发展来说&#xff0c;主动性能帮助我们把握更多的机会&#xff0c;提升我们的职业能力。因此&#xff0c;学会在职场中主动寻找…

glut太阳系源码修改和对cpu占用观察

#include <GL/glut.h> static int day 100; // day 的变化&#xff1a;从 0 到 359 void myDisplay(void) {//glEnable(GL_DEPTH_TEST);glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(75, 1, 1, 40…

车载软件架构 —— 车载软件安全启动关键技术解读

车载软件架构 —— 车载软件安全启动关键技术解读 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能站在他人的角度来反对自己。人生…

Android学习之路(1) App工程的项目结构

一、App工程的项目结构 1.项目下面有两个分类 一个是app(代表app模块)&#xff0c;另一个是Gradle Scripts。其中app下面又有3个子目录&#xff0c;其功能说明如下&#xff1a; manifests 子目录下面只有一个XML文件&#xff0c;即AndroidManifest.xmljava子目录&#xff0c;…

LeetCode-Java(04)

15. 三数之和 固定第一个数&#xff0c;从后面找第二个和的三个数的和等于第一个数&#xff0c;转化为两数之和问题。比target大&#xff0c;则l--&#xff0c;否则r,直到找到三个数 class Solution {public List<List<Integer>> threeSum(int[] nums) {List<L…

笔记本更换固态硬盘和清灰更换硅脂经历分享

本文仅供参考。 目录 购买 固态硬盘和固态硬盘盒 拆机工具 系统迁移 拆机 螺丝花了不要急 换硬盘 清灰 换导热硅脂 处理分区 购买 固态硬盘和固态硬盘盒 自己选购硬盘的时候一定要和自己电脑硬盘型号匹配。至于如何查看自己电脑硬盘型号&#xff0c;这个可以去自己…

web基础与tomcat环境部署

一. 简述静态网页和动态网页的区别。 请求响应信息&#xff0c;发给客户端进行处理&#xff0c;由浏览器进行解析&#xff0c;显示的页面称为静态页面。处理文件类型如.html、jpg、.gif、.mp4、.swf、.avi、.wmv、.flv等 请求响应信息&#xff0c;发给事务端进行处理&#xff0…

Whole Tomato Visual Assist X Crack

Whole Tomato Visual Assist X Crack Visual Assist X通过Visual Studio中的关键新功能和对现有功能的改进&#xff0c;大大缩短了应用程序开发时间&#xff0c;使您能够&#xff1a;Visual Assist提高了自动化程度&#xff0c;简化了导航&#xff0c;并在开发过程中显示重要信…

安卓4G核心板开发板_MTK6785/MT6785(Helio G95)安卓手机主板方案

联发科MTK6785&#xff08;Helio G95&#xff09;安卓核心板采用八核 CPU 具有两个强大的 Arm Cortex-A76 处理器内核&#xff0c;主频高达 2.05GHz&#xff0c;外加六个 Cortex-A55 高效处理器。其强大的图形性能由 Arm Mali-G76 MC4 提供&#xff0c;速度可提升至 900MHz 。 …

阿里云安全组设置

简介​ 云主机安全组必须打开如下端口&#xff1a; ssh&#xff1a;22http&#xff1a;80https&#xff1a;443ftp&#xff1a;21、20000&#xff5e;30000 阿里云安全组端口开放教程​ 腾讯云安全组端口开放教程​ 华为云安全组端口开放教程​

【C++】类和对象—— << 和>>重载、初始化列表、explicit关键字、static关键字、友元

目录 << 和>>重载初始化列表explicit关键字static 关键字友元内部类 << 和>>重载 class Date {//友元声明friend ostream& operator<<(ostream& out, const Date& d);friend istream& operator>>(istream& in, Date&…

VR全景在建筑工程行业能起到哪些作用?

在建筑工程领域&#xff0c;数字化技术为行业的发展起到巨大的推动作用&#xff0c;虽然建筑施工行业主要是依赖于工人劳动力和施工设备&#xff0c;但是VR全景在该行业中方方面面都能应用&#xff0c;从设计建模到项目交付&#xff0c;帮助建筑师以及项目方更好的理解每个环节…

基于图像形态学处理的目标几何形状检测算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 .................................................... %二进制化图像 Images_bin imbinari…