单链表经典oj题 (一) 简单

1.删除指定节点数据(非尾节点),要求时间复杂度为O(1)

. - 力扣(LeetCode)

在之前我们将单链表删除指定节点的操作是先遍历找到pos的前一个结点,然后再进行删除,但是现在要求再O(1)时间内完成,这就要想一种新的思路来解决这个问题了。

我们不能去遍历链表,但是我们能找到要删除的节点的下一个节点,这个题的要求是删除那个数据,并不是说要删除这个节点,那么我们就可以将要删除的节点的数据与下一个结点的数据进行调换,这样问题就转换为了删除下一个节点了,怎样处理就很简单了。

思路有了,而这个题的代码也很简单,那就直接放上答案。

void deleteNode(struct ListNode* node) {
    struct ListNode* next=node->next;
    node->val=node->next->val;
    node->next=node->next->next;
    free(next);
}

2.返回倒数第k个节点

. - 力扣(LeetCode)

看到这个题的第一个思路就是暴力求解,首先遍历一遍链表,统计节点个数 n ,然后第n+1-k个节点就是倒数第 k 个节点 。

int kthToLast(struct ListNode* head, int k){
    int n=0;
    struct ListNode* cur=head;
    while(cur)
    {
        n++;
        cur=cur->next;
    }
    n=n-k+1;
    cur=head;
    while(--n)//第n个节点只要循环n-1次
    {
        cur=cur->next;
    }
    return cur->val;

}

但是这个题还有一这种思路只用遍历一遍链表,我们用快慢指针来解决,首先fast先往后走k步

这时slow和fast再同时往后走,当fast为NULL的时候,slow就是倒数第k个节点

这样实现起来代码也很简单

int kthToLast(struct ListNode* head, int k){
    struct ListNode* fast=head;
    struct ListNode* slow=head;
    while(k--)
    {
        fast=fast->next;
    }
    while(fast)
    {
        fast=fast->next;
        slow=slow->next;
    }
    return slow->val;
}

因为题目中明确说明了k是有效的,所以我们就不用判断fast在第一个循环就走到了NULL的情况的。

掌握了上面的题,再来做一个相似的题

删除链表的倒数第N个节点,并返回新的头节点

https://leetcode.cn/problems/SLwz0R/

这个题是要删除倒数第N个节点,那我们首先要找到倒数第N+1个节点,修改这个节点的next。

这个题目中给的信息是N<=sz,这就说明有可能删除的是头节点的,所以在fast走完N步之后,要先判断fast是否已经为空,如果fast已经是NULL了,则说明要删除的是头节点。

如果这时候fast不为空,则说明要删的不是头节点,这时候fast再往前走一步,

struct ListNode* removeNthFromEnd(struct ListNode* head, int n){
    struct ListNode* fast=head;
    struct ListNode* slow=head;
    while(n--)
    {
        fast=fast->next;
    }
    if(fast==NULL)//判断要删除的是否是头节点
    {
        head=head->next;
        free(slow);
        return head;
    }
    //不是头节点在快慢指针继续走
    fast=fast->next;
    while(fast)
    {
        fast=fast->next;
        slow=slow->next;
    }
    struct ListNode* del=slow->next;
    slow->next=del->next;
    free(del);
    return head; 

}

3.反转链表

. - 力扣(LeetCode)

反转链表的思路就是遍历每个节点然后头插,

要注意的就是要记录cur的下一个节点的地址。

struct ListNode* reverseList(struct ListNode* head) {
    struct ListNode* newhead=NULL;
    struct ListNode* cur=head;
    struct ListNdoe* next=NULL;
    while(cur)
    {
        //记录下一个节点
        next=cur->next;
        //头插
        cur->next=newhead;
        //换头
        newhead=cur;

        //迭代
        cur=next;
    }
    return newhead;
}

写完这段代码之后先思考一下空链表的问题,由于我们newhead初始化为NULL,如果是空链表的话,返回时的newhead也是NULLL,所以不会有问题。

4.合并两个升序链表

. - 力扣(LeetCode)

合并两个升序链表我们很容易想到在之前的数组阶段见过的合并两个升序数组,当时我们使用的是归并排序,在链表中我们同样可以用归并来合并两个链表。首先我们用一个哨兵位的头节点来接收归并后的链表,因为合并升序链表要用到尾插,我们再用一个tail来记录新链表的尾。

然后我们用两个指针来遍历两个链表,取小的尾插到新链表上去,直到cur1或者cur2指向NULL,之后再将没遍历完的链表插入到新链表后面。

struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {
    struct ListNode* guard=(struct ListNode*)malloc(sizeof(struct ListNode));
    guard->next=NULL;
    struct ListNode* tail=guard;
    struct ListNode* cur1=list1;
    struct ListNode* cur2=list2;
    while(cur1&&cur2)
    {
        if(cur1->val<=cur2->val)
        {
            tail->next=cur1;
            tail=cur1;
            cur1=cur1->next;
        }
        else
        {
            tail->next=cur2;
            tail=cur2;
            cur2=cur2->next;
        }
    }
    if(cur1)//cur2遍历完了
    {
        tail->next=cur1;
    }
    else
    {
        tail->next=cur2;
    }
    struct ListNode* head=guard->next;
    free(guard);
    return head;

}

5.链表相交

. - 力扣(LeetCode)

这个题我们首先要判断两个链表是否相交,判断相交不难,因为如果两个链表相交的话,他们的尾节点是相同的,所以我们可以遍历两个链表,判断两个链表的尾节点是否相同。

    if(!headA||!headB)//有一个空链表就返回NULL
    return NULL;
    struct ListNode* cur1=headA;
    struct ListNode* cur2=headB;

    while(cur1->next)
    {
        cur1=cur1->next;
    }
    while(cur2->next)
    {
        cur2=cur2->next;
    }
    if(cur1!=cur2)//不相交
    {
        return NULL;
    }
    else
    {
        //找相交节点
    }
    

我们首先判断一下两个链表是否有空链表,如果有一个是空链表或者都是空链表,则没有相交。

在判断完是否相交之后,如何去找相交的节点呢?

首先我们是可以求出两个链表的节点的个数的,也就是链表的长度,当链表相交之后后半段的长度是相等的,所以两个链表的长度差就差在相交之前的部分。

那么我们是不是可以让长的链表先走 他们的长度差 的步数,如何在两个指针一起走,这样他们相遇的节点就是相交的起始节点。

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
    if(!headA||!headB)//有一个空链表就返回NULL
    return NULL;
    struct ListNode* cur1=headA;
    struct ListNode* cur2=headB;
    int lenA=0;
    int lenB=0;
    while(cur1->next)
    {
        cur1=cur1->next;
        lenA++;
    }
    while(cur2->next)
    {
        cur2=cur2->next;
        lenB++;
    }
    if(cur1!=cur2)//不相交
    {
        return NULL;
    }
    else
    {
        //找相交节点
        struct ListNode* longlist = (lenA>lenB?headA:headB);
        struct ListNode* shortlist = (lenA>lenB?headB:headA);
        //求出长度差
        int gap=abs(lenA-lenB);
        //长链表先走gap步
        while(gap--)
        {
            longlist=longlist->next;
        }
        //同时走
        while(longlist!=shortlist)
        {
            longlist=longlist->next;
            shortlist=shortlist->next;
        }
        return shortlist;
    }
    
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

博客部署001-centos安装docker

1、安装docker 1.1 卸载旧版本的 Docker sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine1.2 设置 Docker 仓库 安装 Docker Engine 之前&#xff0c;首先需要设置…

力扣Lc29---- 541. 反转字符串 II(java版)-2024年4月06日

1.题目描述 2.知识点 &#xff08;1&#xff09;执行步骤如下&#xff1a; 初始化 s “abcdefg” 和 k 2 将字符串分割成长度为 2k 4 的块。 对每个块中的前 k 2 个字符进行反转。 执行过程 1&#xff09;第一次循环&#xff08;i 0&#xff09; start 0 end Math.min(0…

心法利器[112] | 考古RAG-20年RAG概念提出的论文

心法利器 本栏目主要和大家一起讨论近期自己学习的心得和体会。具体介绍&#xff1a;仓颉专项&#xff1a;飞机大炮我都会&#xff0c;利器心法我还有。 2023年新的文章合集已经发布&#xff0c;获取方式看这里&#xff1a;又添十万字-CS的陋室2023年文章合集来袭&#xff0c;更…

计算机视觉——基于傅里叶幅度谱文档倾斜度检测与校正

概述 在计算机视觉领域&#xff0c;处理文档数据时&#xff0c;OCR算法的性能往往会受到文档的倾斜度影响。如果文档在输入到模型之前没有经过恰当的校正&#xff0c;模型就无法期待模型能够提供准确的预测结果&#xff0c;或者模型预测的精度会降低。例如&#xff0c;在信息提…

Qt Creator 新建项目

&#x1f40c;博主主页&#xff1a;&#x1f40c;​倔强的大蜗牛&#x1f40c;​ &#x1f4da;专栏分类&#xff1a;QT❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、使用 Qt Creator 新建项目 1、新建项目 2、选择项目模板 3、选择项目路径 4、选择构建系统 5…

usb_camera传输视频流编码的问题记录!

前言&#xff1a; 大家好&#xff0c;今天给大家分享的内容是&#xff0c;一个vip课程付费的朋友&#xff0c;在学习过程中遇到了一个usb采集的视频数据流&#xff0c;经过ffmpeg编码&#xff0c;出现了问题&#xff1a; 问题分析&#xff1a; 其实这个问题不难&#xff0c;关键…

漂亮国的无人餐厅的机器人骚操作

导语 大家好&#xff0c;我是智能仓储物流技术研习社的社长&#xff0c;你的老朋友&#xff0c;老K。行业群 新书《智能物流系统构成与技术实践》 知名企业 读者福利&#xff1a; &#x1f449;抄底-仓储机器人-即买即用-免调试 智能制造-话题精读 1、西门子、ABB、汇川&#x…

Linux--03---虚拟机网络配置、拍摄快照和克隆

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.虚拟机网络配置1.虚拟机的联网模式模式1 仅主机模式特点模式2 桥接模式特点模式3 NAT模式特点关于模式的选择 2. 修改网络配置信息3.修改虚拟机ens33网卡的网络配…

【CNN】ConvMixer探究ViT的Patch Embedding: Patches Are All You Need?

Patches Are All You Need? 探究Patch Embedding在ViT上的作用&#xff0c;CNN是否可用该操作提升性能&#xff1f; 论文链接&#xff1a;https://openreview.net/pdf?idTVHS5Y4dNvM 代码链接&#xff1a;https://github.com/tmp-iclr/convmixer 1、摘要 ViT的性能是由于T…

【二分查找】Leetcode 在排序数组中查找元素的第一个和最后一个位置

题目解析 34. 在排序数组中查找元素的第一个和最后一个位置 我们使用暴力方法进行算法演化&#xff0c;寻找一个数字的区间&#xff0c;我们可以顺序查找&#xff0c;记录最终结果 首先数组是有序的&#xff0c;所以使用二分法很好上手&#xff0c;但是我们就仅仅使用上一道题…

2. Django配置信息

第2章 Django配置信息 Django的配置文件settings.py用于配置整个网站的环境和功能, 核心配置必须有项目路径, 密钥配置, 域名访问权限, App列表, 中间件, 资源文件, 模板配置, 数据库的连接方式.* 项目运行时, 如果修改代码, 项目会自动检测发现改动后会重新运行, 除非报错否…

xss.pwnfunction-Jefff

在eval中可以直接执行命令所以直接把"直接闭合在结尾再加上一个"因为后面的"没闭和会报错 ?jeffa";alert(1);" 或 ?jeffa"-alert(1)-" -是分隔符

根据状态转移表实现时序电路

描述 某同步时序电路转换表如下&#xff0c;请使用D触发器和必要的逻辑门实现此同步时序电路&#xff0c;用Verilog语言描述。 电路的接口如下图所示。 输入描述 input A ,input clk ,input rst_n 输出描述 output …

Windows11下Docker使用记录(二)

Docker使用记录&#xff08;二&#xff09; 1. 常用指令2. Dockerfile示例3. 构建docker image Docker中container&#xff0c;image&#xff0c;dockerfile 以及docker hub的关系如图所示&#xff0c;详细可见上一篇帖子。 本文主要记录Dockerfile相关。 1. 常用指令 常用指令…

matlab:五点中心差分求解Navier边界的Biharmonic方程(具有纳维尔边界的双调和方程)

我们考虑如下形式的双调和方程的数值解 其中&#xff0c;Ω是欧氏空间中的多边形或多面体域&#xff0c;在其中&#xff0c;d为维度&#xff0c;具有分段利普希茨边界&#xff0c;满足内部锥条件&#xff0c;f(x) ∈ L2(Ω)是给定的函数&#xff0c;∆是标准的拉普拉斯算子。算…

Open3D (C++) 从.txt文件中读取数据到矩阵

目录 一、算法概述二、代码实现三、结果展示四、测试数据本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法概述 在进行实验的时候有时需要借助不同的工具来实现一些比较复杂的操作,比如使用matlab中自带的拉…

竞赛 交通目标检测-行人车辆检测流量计数 - 竞赛

文章目录 0 前言1\. 目标检测概况1.1 什么是目标检测&#xff1f;1.2 发展阶段 2\. 行人检测2.1 行人检测简介2.2 行人检测技术难点2.3 行人检测实现效果2.4 关键代码-训练过程 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 毕业设计…

AI大语言模型GPT —— R 生态环境领域数据统计分析

自2022年GPT&#xff08;Generative Pre-trained Transformer&#xff09;大语言模型的发布以来&#xff0c;它以其卓越的自然语言处理能力和广泛的应用潜力&#xff0c;在学术界和工业界掀起了一场革命。在短短一年多的时间里&#xff0c;GPT已经在多个领域展现出其独特的价值…

卫星遥感影像如何选择合适的分辨率

​ 卫星遥感影像的分辨率是影响其应用效果的关键因素之一。分辨率越高&#xff0c;所获取的图像细节越丰富&#xff0c;能够更准确地反映地物的特征和变化。因此&#xff0c;在选择卫星遥感影像时&#xff0c;需要根据实际需求和数据可获取性来选择合适的分辨率。 一、分辨…

好看流光风格个人主页HTML源码

这是一款好看流光风格个人主页HTML源码&#xff0c;感觉挺喜欢的&#xff0c;需要的自行下载&#xff01; 源码下载 好看流光风格个人主页源码