IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 算法提升 (三)基础数据结构 -> 正文阅读

[数据结构与算法]算法提升 (三)基础数据结构

作者:@小萌新
专栏:@算法提升
作者简介:大二学生 希望能够和大家一起进步!
内容简介:简单介绍基本数据结构的简单面试题
在这里插入图片描述
不负韶华

链表

阅读这篇文章之前需要有初阶数据结构的基础

关于链表的结构如果还有不了解的同学可以参考下我的这篇文章

链表的详细介绍

1. 反转单链表

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

这个题目在算法方面其实没有太多的技巧

主要是锻炼下我们的coding能力

我们来看图

在这里插入图片描述

单次的操作大概是这样子的

我们将当前的指针指向前面一个指针 这样子操作就完成啦

后面其实就是迭代操作

prev到pos位置

pos到next位置

next到最后的位置

代码表示如下

struct ListNode* reverseList(struct ListNode* head)
{
    if(head==NULL)
    {
        return NULL;
    }

    // 设置两个种子很 一个前指针一个后指针一个当前指针
    struct ListNode* prev =NULL;
    struct ListNode* pos =head;
    struct ListNode* next =head;


    while(pos)
    {
        next=next->next;
        pos->next = prev;
        prev = pos;
        pos =next;
    }

    return prev;
}

没有什么难度

2. 反转双链表

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

这个的思路和前面反转单链表完全一致 按照上面的思路搞就可以

这里不再赘述

3. 删除链表中的重复项

给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。

我们先考虑一种特殊情况 当我们的头就是我们要删除的节点的时候是不是要用头删啊

并且这个时候还需要移动头的位置

直到我们当前的数据不是我们要删除的数据了 是不是头才能确定下来 大家想想看是不是

之后就很简单了

cur找重复项 prev记录前面的值

如果cur是重复项的话 prev就指向cur的next

之后prev走到cur的位置 cur往前跑 不断循环 之后返回head就可以了

代码表示如下

struct ListNode* deleteNode(struct ListNode* head, int val)
{
    // 首先判断 如果整个链表为空 直接返回一个空就好
    if(head==NULL)
    {
        return NULL;
    }

    // 之后我们使用两个指针来进行删除 一个当前指针 一个next指针 
    struct ListNode* cur = (struct ListNode*)malloc(sizeof(struct ListNode));
    struct ListNode* prev = (struct ListNode*)malloc(sizeof(struct ListNode));

    cur = head;
    // 前面以及判断过head不为空 这里放心用
    while(cur && cur ->val == val)
    {
        prev = cur;
        cur=cur->next;
        free(prev);
        head = cur;
    }
    



    // 后面开始考虑普通情况

    while(cur)
    {
        // 开始找要删的数据 找不到就往前遍历
        if(cur->val==val)
        {
            prev ->next = cur->next;
            prev = cur;
            cur = cur->next;
            free(prev);
        }
        else
        {
            prev = cur;
            cur = cur->next;
        }

    }

    return head;
}

队列和栈

还是跟前面一样 在看后面的内容之前需要有队列相关知识

具体大家可以看看我写的这两篇文章啊

初阶数据结构 队列

初阶数据结构 栈

1. 循环队列

这道题前面的博客已经写过了 这里简单介绍下思路

在这里插入图片描述

首先我们可以设置两个指针 分别指向头尾

但是我们这里发现 不太好判断队列的空 满是吧

那么这里我们可以增加一个参数 size

如果size= 0

是不是就代表队列为空

如果size = 最大值

是不是就代表队列为满

对这道题有兴趣的同学可以看看我的这篇博客 试着用我这里提供的方法将这个循环队列写出来

循环队列

2. 特殊栈

要求我们实现一个特殊的栈

它有两个功能

一个功能和基础的栈一样

还有一个功能是能够返回这个栈里面的最小值

这个思路也很简单

我们用两个栈来实现就好了

一个栈实现全部的普通功能

一个栈压栈的时候

1 如果为空 就压栈第一个元素

2 如果不为空 压栈当前元素和栈内最小元素两者的较小值

在这里插入图片描述

这样子就可以啦

3. 队列与栈

用两个队列实现栈

用两个栈实现队列

这两个题目前面的博客中均有涉及

大家可以移步观看

队列实现栈

栈实现队列

总结

在这里插入图片描述

简单介绍了几种基本数据结构的面试题目
由于博主水平优先所以出现错在所难免 希望大佬看到可以指正
如果帮助到大家别忘了一键三连啊
阿尼亚 哇酷哇酷!

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-11-05 00:49:40  更:2022-11-05 00:53:16 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 19:46:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码