【数据结构与算法篇】单链表及相关OJ算法题

news2024/11/25 8:16:09

【数据结构与算法篇】单链表及相关OJ算法题

🥕个人主页:开敲🍉

🔥所属专栏:数据结构与算法🍅

🌼文章目录🌼

1. 单链表的实现(近300行实现代码)

1.1 SList.h 头文件的声明

1.2 SList.c 源文件的定义

1.3 Test.c 源文件的测试

2.  OJ算法题

  2.1 206. 反转链表 - 力扣(LeetCode)

  2.2 203. 移除链表元素 - 力扣(LeetCode)

  2.3 876. 链表的中间结点 - 力扣(LeetCode)

1. 单链表的实现(近300行实现代码)

1.1 SList.h 头文件的声明

#pragma once


#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

typedef int SLDataType;

typedef struct SListNode SL;

struct SListNode
{
    SLDataType value;
    SL* next;
};


//打印
void SLPrint(SL* phead);x


//申请空间
SL* SLBuyNode(SLDataType x);


//尾插
void SLPushBack(SL** pphead, SLDataType x);


//头插
void SLPushHead(SL** pphead, SLDataType x);

//指定插入
void SLPushDesi(SL** pphead,int y,SLDataType x);


//尾删
void SLPopBack(SL** pphead);


//头删
void SLPopHead(SL** pphead);

//指定删除
void SLPopDesi(SL** pphead, int y);


//查找
void SLFind(SL* pphead, int y);

//更改
void SLChange(SL** pphead, int y, SLDataType x);

1.2 SList.c 源文件的定义

#define _CRT_SECURE_NO_WARNINGS 1


#include "SList.h"

//打印
void SLPrint(SL* phead)
{
    SL* pcur = phead;
    while(pcur)
    {
        printf("%d->", pcur->value);
        pcur = pcur->next;
    }
    printf("NULL\n");
}


//申请空间
SL* SLBuyNode(SLDataType x)
{
    SL* pcur = (SL*)malloc(sizeof(SL));
    if (pcur == NULL)
    {
        perror("maolloc");
        exit(-1);
    }
    pcur->value = x;
    pcur->next = NULL;
    return pcur;
}

//尾插
void SLPushBack(SL** pphead, SLDataType x)
{
    SL* find = SLBuyNode(x);
    SL* pcur = *pphead;
    if ((*pphead) == NULL)
    {
        *pphead = find;
    }
    else
    {
        while (pcur->next)
        {
            pcur = pcur->next;
        }
        pcur->next = find;
    }
}

//头插
void SLPushHead(SL** pphead, SLDataType x)
{
    SL* find = SLBuyNode(x);
    if ((*pphead) == NULL)
    {
        *pphead = find;
    }
    else
    {
        find->next = *pphead;
        *pphead = find;
    }
}

//寻找
SL* FindSList(SL* pf, int y)
{
    SL* pcur = pf;
    while (y - 2)
    {
        if (pcur == NULL)
        {
            return NULL;
        }
        pcur = pcur->next;
        y--;
    }
    return pcur;
}


//指定插入
void SLPushDesi(SL** pphead, int y , SLDataType x)
{
    assert(*pphead&&pphead);
    SL* pcur = FindSList(*pphead, y);
    if (!pcur)
    {
        printf("插入越界,无法在此处插入数据!\n");
        exit(-1);
    }
    SL* ptmp = SLBuyNode(x);
    ptmp->next = pcur->next;
    pcur->next = ptmp;
}

//尾删
void SLPopBack(SL** pphead)
{
    assert(*pphead);
    if ((*pphead)->next == NULL)
    {
        free(*pphead);
        *pphead = NULL;
        return;
    }
    SL* pcur = *pphead;
    SL* ptmp = *pphead;
    while (pcur->next)
    {
        pcur = pcur->next;
        while (ptmp->next->next)
        {
            ptmp = ptmp->next;
        }
    }
    ptmp->next = NULL;
    free(pcur);
}


//头删
void SLPopHead(SL** pphead)
{
    assert(pphead&&*pphead);
    SL* pcur = *pphead;
    if ((*pphead)->next == NULL)
    {
        free(*pphead);
        *pphead = NULL;
        return;
    }
    (*pphead) = (*pphead)->next;
    free(pcur);
}

//指定删除

void SLPopDesi(SL** pphead, int y)
{
    assert(pphead&&*pphead);
    SL* pcur = FindSList(*pphead, y);
    SL* ptmp = pcur->next;
    if (!(pcur->next))
    {
        printf("删除越界,无法在此处删除数据!\n");
        return;
    }
    pcur->next = pcur->next->next;
    free(ptmp);
}


//查找
void SLFind(SL* pphead, int y)
{
    assert(pphead);
    SL* pcur = FindSList(pphead, y);
    if (!(pcur->next))
    {
        printf("查询失败!\n");
        return;
    }
    printf("查询成功!\n");
    printf("该位置数据为:%d\n", pcur->next->value);
    return;
}


//更改
void SLChange(SL** pphead, int y, SLDataType x)
{
    assert(*pphead);
    SL* pcur = FindSList(*pphead, y);
    if (!(pcur->next))
    {
        printf("更改失败,该位置无数据可更改!\n");
        return;
    }
    pcur->next->value = x;
}

1.3 Test.c 源文件的测试

#define _CRT_SECURE_NO_WARNINGS 1

#include "SList.h"


void TestSList()
{
    SL* plist = NULL;

//尾插
    SLPushBack(&plist, 1);
    SLPushBack(&plist, 2);
    SLPushBack(&plist, 3);
    SLPushBack(&plist, 4);
    SLPrint(plist);//打印

//头插

    SLPushHead(&plist, 0);
    SLPrint(plist);//打印

//指定插入

    SLPushDesi(&plist, 3, 5);
    SLPrint(plist);

//越界指定插入

    SLPushDesi(&plist, 7, 10);
    SLPrint(plist);

//尾删

    SLPopBack(&plist);
    SLPrint(plist);

//头删

    SLPopHead(&plist);
    SLPrint(plist);

//指定删除

    SLPopDesi(&plist, 3);
    SLPrint(plist);

//指定删除越界

    SLPopDesi(&plist, 5);


//查找

    SLFind(plist, 4);

//查找越界

    SLFind(plist, 5);

//更改

    SLChange(&plist, 3, 1);
    SLPrint(plist);

 

//更改越界

    SLChange(&plist, 5, 1);

}


int main()
{
    TestSList();
    return 0;
}

2.  OJ算法题

  2.1 206. 反转链表 - 力扣(LeetCode)

//思路:三指针解法。指针pf1开始指向NULL,指针pf2开始指向头节点,指针pf3指向pf2中的next节点,三个同时往后遍历,当pf2走到NULL时,pf1就是要返回的头节点

struct ListNode* reverseList(struct ListNode* head)

{

    struct ListNode* pf1 = NULL;

    struct ListNode* pf2 = head;

    while(pf2)

    {

        struct ListNode* pf3 = pf2->next;

        pf2->next = pf1;

        pf1 = pf2;

        pf2 = pf3;

    }

    return pf1;

}

  2.2 203. 移除链表元素 - 力扣(LeetCode)

//思路:遍历。使用指针pf1放头节点,遍历链表,如果pf1->->val等于题目所给val,则直接将当前next指向next->next,跳过val所在节点

//需要注意的是,需要考虑链表中的val都是题目所给val已经空链表的情况

struct ListNode* removeElements(struct ListNode* head, int val)

{

    while(head!=NULL&&(head->val)==val)

    {

        head = head->next;

    }

    if(!head)

    {

        return head;

    }

    struct ListNode* pf1 = head;

    while(pf1->next)

    {

        if((pf1->next->val)==val)

        {

            pf1->next = pf1->next->next;

        }

        else

        {

            pf1 = pf1->next;

        }

    }

    return head;

}

  2.3 876. 链表的中间结点 - 力扣(LeetCode)

//思路:快慢指针算法,这种寻找中间点的算法题使用快慢指针会非常便捷高效。主要思路就是指针pf1每次走一个节点,指针pf2每次走两个节点,当pf2走到末节点或走出链表时,pf1所指向的就是需要返回的中间节点。

struct ListNode* middleNode(struct ListNode* head)

{

    struct ListNode* pf1 = head;

    struct ListNode* pf2 = head;

    while(pf2&&pf2->next)

    {

        pf2 = pf2->next->next;

        pf1 = pf1->next;

    }

    return pf1;

}

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

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

相关文章

指针 运算偏移

思维导图&#xff1a; 题目&#xff1a; 1.变量的指针&#xff0c;其含义是指该变量的 B 。 A&#xff09;值 B&#xff09;地址 C&#xff09;名 D&#xff09;一个标志 2.已有定义int k2;int *ptr1,*ptr2;且ptr1和ptr2均…

每日OJ题_两个数组dp⑥_力扣97. 交错字符串

目录 力扣97. 交错字符串 解析代码 力扣97. 交错字符串 97. 交错字符串 难度 中等 给定三个字符串 s1、s2、s3&#xff0c;请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。 两个字符串 s 和 t 交错 的定义与过程如下&#xff0c;其中每个字符串都会被分割成若干 非空 子…

YOLOv5标签值含义根据标签将检测框色块替换(马赛克)

以一个检测人脸的图片为例&#xff1a; 检测后生成的标签txt如下&#xff0c; 此时&#xff0c;如何根据标签值将检测到的人脸同色块替换呢&#xff1f; 关键是获取检测框的左上角坐标和右下角坐标。 img Image.open(D:/PythonWokspace/JINX/datasets_transform/dataset/im…

【grpc】三、grpc入门,内置日志打印

一、开启条件 通过查看 grpc 的内置文件可以看到&#xff0c;日志打印是由环境变量控制的&#xff1a; export GRPC_GO_LOG_VERBOSITY_LEVEL99 # 日志详细程度&#xff0c;这里99为最高 export GRPC_GO_LOG_SEVERITY_LEVELinfo # 日志等级&#xff0c;这里为info如果是用Gol…

接雨水(双指针)

11. 盛最多水的容器 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 样例输入 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,…

Vue文档

Vue是什么&#xff1f;为什么要学习他 Vue是什么&#xff1f; Vue是前端优秀框架&#xff0c; 是一套用于构建用户界面的渐进式框架 为什么要学习Vue Vue是目前前端最火的框架之一Vue是目前企业技术栈中要求的知识点Vue可以提升开发体验Vue学习难度较低… Vue开发前的准备 安…

SpringMVC数据接收(全面/详细注释)

SpringMVC涉及组件&#xff1a; DispatcherServlet : SpringMVC提供&#xff0c;我们需要使用web.xml配置使其生效&#xff0c;它是整个流程处理的核心&#xff0c;所有请求都经过它的处理和分发&#xff01;[ CEO ]HandlerMapping : SpringMVC提供&#xff0c;我们需要进行…

MySQL8.3.0 主从复制方案(master/slave)

一 、什么是MySQL主从 MySQL主从&#xff08;Master-Slave&#xff09;复制是一种数据复制机制&#xff0c;用于将一个MySQL数据库服务器&#xff08;主服务器&#xff09;的数据复制到其他一个或多个MySQL数据库服务器&#xff08;从服务器&#xff09;。这种复制机制可以提供…

若依框架学习——分页查询列表

条件查询【多条件】列表展示【分页】SaCheckPermissionTableName TableId NotBlank Page分页 字典&#xff1a; 响应数据封装类

ModuleNotFoundError: No module named ‘ultralytics.utils‘

项目场景he 问题描述 提示&#xff1a;这里简述项目相关背景&#xff1a; model YOLO(modelr./yolov8m-cls.pt) 加载预训练模型时报错。 ModuleNotFoundError: No module named ultralytics.utils warning: bug: 原因分析&#xff1a; 很可能是提前下载的预训练模型出了…

贪心算法|406.根据身高重建队列

力扣题目链接 class Solution { public:static bool cmp(const vector<int>& a, const vector<int>& b) {if (a[0] b[0]) return a[1] < b[1];return a[0] > b[0];}vector<vector<int>> reconstructQueue(vector<vector<int>…

c语言 :柔性数组与c/c++内存领域的划分

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一 柔性数组&#xff08;1&#xff09;什么是柔性数组1&#xff09;柔性数组的声明2&#xff09;柔性数组的特性 &#xff08;2&#xff09;柔性数组的使用 二 c/c内…

HarmonyOS 应用开发-ArkUI(ets)仿“腾讯新闻”APP

一、效果演示 1、新闻列表页 2、新闻详情页、图片展示页 3、视频页 4、动态页 二、 流程图 –本来自定义了视频的控制栏的&#xff0c;但是发现VideoController()控制器的bug会导致控制器失效&#xff0c;所以没继续做。视频页先不搞了。 三、文件组织&#xff08;“我的页面…

性能优化 - 你知道dns-prefetch有什么用吗

难度级别:中级及以上 提问概率:50% 我们在HTML文档里写一个script标签,为src属性指定Javascript文件网络地址,这是一件再平凡不过的事情。当浏览器加载HTML文档,加载到这个script标签的时候,就会去下载Javascript文件。而在下载之前,就…

Unity类银河恶魔城学习记录12-8 p130 Skill Tree UI源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili UI.cs using UnityEngine;public class UI : MonoBehaviour {[SerializeFi…

C++中高阶数据结构(AVL树的原理讲解)

AVL树 AVL树的定义 avl本质是搜索树,是高度平衡二叉搜索树.特点是:任何树的左右子树的高度差不超过1.最大的高度差值最大也只能是1,也称之为平衡因子, 平衡因子就是右子树减去左子树的值,这个值的绝对值的最大值只能是1.这个平衡因子不是必须的,只是一种控制方式,方便我们更…

stable diffusion的从安装到使用

stable-diffusion&#xff0c;一个免费开源的文生图软件&#xff0c;文章主要讲怎么从源码开始安装&#xff0c;以及使用的方式 git地址&#xff1a;https://github.com/AUTOMATIC1111/stable-diffusion-webui 本人电脑环境win10&#xff0c;软件pycharm&#xff0c;需要提前…

【话题:工作生活】2022年工作总结--疫情下的上海,疫情中的我。

现在是阳历2023年11月27日星期一&#xff0c;我再次开始撰写自己的年终工作总结。希望再过1、2个月&#xff0c;这份年终总结能够出炉&#xff0c;与大家相遇。 给自己定个小目标&#xff0c;年终的工作生活总结坚持写10年。我2017年毕业&#xff0c;之后就开始写每年的年终总结…

密码应用方案测评要点及测评过程

&#xff08;1&#xff09;背景 《GBT39786-2021 信息系统密码应用基本要求》中第1-4级密码应用基本要求均包括“应依据相关标准和密码应用需求&#xff0c;制定密码应用方案”。第1-4级密码应用基本要求对于“投入运行前进行密码应用安全性评估”的具体如下。 第一级&#xff…

微信小程序Skyline模式下瀑布长列表优化成虚拟列表,解决内存问题

微信小程序长列表&#xff0c;渲染的越多就会导致内存吃的越多。特别是长列表的图片组件和广告组件。 为了解决内存问题&#xff0c;所以看了很多人的资料&#xff0c;都不太符合通用的解决方式&#xff0c;很多需要固定子组件高度&#xff0c;但是瀑布流是无法固定的&#xf…