单链表在线OJ题二(详解+图解)

1.在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针

在这里插入图片描述
本题的意思是要删除链表中重复出现的节点,然后返回删除重复节点后的链表。
我们可以直接用一个哨兵位以便于观察链表的情况,然后用前后指针来解决这个问题。如果当前节点cur的值与其当前节点的next的所存储的值相等(且cur的next不为空),cur就变成cur的next,然后用while循环进行判断,如果cur的val与cur的next的val相等且cur的next不为空,就然后cur往后移动,直到遇到不相同的情况,跳出循环后cur还要记得移动到cur的next;然后再将前指针prev的next置为cur,这样就可以将相等的节点省略。当cur的next为空或者cur的值与cur的next的值不相等时,就直接先将prev置为cur,再将cur往后移动变成cur的next。最后返回哨兵位vpead的next,就是存储了有效数据的首节点,就可以返回整个删除后的单链表了。
在这里插入图片描述

完整代码如下:

struct ListNode *deleteDuplication(struct ListNode *pHead)
{
    struct ListNode *vHead;
    vHead = (struct ListNode *)malloc(sizeof(struct ListNode));
    vHead->next = pHead;
    //定义虚头结点方便边界情况讨论
    struct ListNode *pre, *cur;
    pre = vHead, cur = pHead;
    while (cur)
    {
        if (cur->next && cur->val == cur->next->val)
        {
            cur = cur->next;
            while (cur->next && cur->val == cur->next->val)
                cur = cur->next;
        //当遇到与下一节点值相同时,cur推进到最后一个重复的数字处
        //本数字舍去,pre连接到下一个
            cur = cur->next;
            pre->next = cur;
        }
        //遇到与下一节点值不同或者是没有下一节点时,pre移动到此处,cur继续后移
        else if(!cur->next || cur->val != cur->next->val)
        {
            pre = cur;
            cur = cur->next;
        }
    }
    return vHead->next;
}
2.对链表进行插入排序

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
本题也要使用到哨兵位,用哨兵位的next最后可以返回排序完后的链表,并且使用前后指针,进行大小比较,若是逆序则用前后指针的关系进行交换即可
完整代码如下:

struct ListNode *insertionSortList(struct ListNode *head) 
{
    if (head == NULL) 
        return head;
    struct ListNode *dummyHead = malloc(sizeof(struct ListNode));
    dummyHead->val = 0;
    dummyHead->next = head;//哨兵位
    struct ListNode *lastSorted = head;
    struct ListNode *curr = head->next;
    while (curr != NULL) {
        if (lastSorted->val <= curr->val) 
        {
            lastSorted = lastSorted->next;
        } 
        else 
        {
            struct ListNode *prev = dummyHead;
            while (prev->next->val <= curr->val) 
            {
                prev = prev->next;
            }
            lastSorted->next = curr->next;
            curr->next = prev->next;
            prev->next = curr;
        }
        curr = lastSorted->next;
    }
    return dummyHead->next;
}
3.给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 NULL

在这里插入图片描述
本题的意思很简单,就是一个判断链表是否有环的问题,如果有环就返回那个节点,看图就明白了,就是最后一个节点的next会连接到前面的节点,就是有环。
到这里我们就要有一个大概的思路了–快慢指针!
我们用慢指针slow一次走一步,fast一次走两步,到最后他们就一定会相遇,因为他们移动的差距只有一步一次追一步就必然会相遇。当slow和fast相遇时,我们再定义一个新指针从头节点开始往后移动,同时将slow或者fast往后移动,当这个新指针与slow或者fast相等时这个节点就返回这个节点,这个节点就是链表尾链接到链表的节点。
在这里插入图片描述

完整代码如下:

struct ListNode* detectCycle(struct ListNode* head) 
{
    struct ListNode *slow = head, *fast = head;
    while (fast != NULL) 
    {
        slow = slow->next;
        if (fast->next == NULL) 
        {
            return NULL;
        }
        fast = fast->next->next;
        if (fast == slow) 
        {
            struct ListNode* ptr = head;
            while (ptr != slow) 
            {
                ptr = ptr->next;
                slow = slow->next;
            }
            return ptr;
        }
    }
    return NULL;
}
4.给定一个链表,判断链表中是否有环

在这里插入图片描述
有了上一题的思路,这一题就很简单了,让slow指针和fast指针分别往后移动,slow一次走一步,fast一次走两步,如果二者能相遇(相遇即slow指针会与fast指针相等),那就是链表中有环,否则无环;
在这里插入图片描述

完整代码如下:

bool hasCycle(struct ListNode *head) 
{
    struct ListNode* slow=head;
    struct ListNode* fast=head;
    while(fast&&fast->next)
    {
        slow=slow->next;
        fast=fast->next->next;
        if(slow==fast)
            return true;
    }
    return false;
}
5.输入两个链表,找出它们的第一个公共结点

在这里插入图片描述
其实这一题也很简单
首先我们得判断这个链表是否会相交,如果相交,那么两个链表的尾节点就会相等,若不想等就直接返回NULL指针
其次我们分别求两个链表的长度,用tail尾指针遍历求出lenA,lenB
然后我们用lenA-lenB相减的绝对值就能得出两个链表的长度差gap,让长的链表先走gap步,然后短的链表再和长的链表一起走,当两个链表的指针节点相等时,这个节点就是两个链表相遇的节点,返回这个节点即可
在这里插入图片描述

完整代码如下:

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) 
{
    struct ListNode* tailA=headA;
    struct ListNode* tailB=headB;
    int lenA=1;
    int lenB=1;
    while(tailA)
    {
        tailA=tailA->next;
        lenA++;
    }
    while(tailB)
    {
        tailB=tailB->next;
        lenB++;
    }
    if(tailA!=tailB)
    {
        return NULL;
    }
    int gap=abs(lenA-lenB);
    struct ListNode* longlist=headA;
    struct ListNode* shortlist=headB;
    if(lenA<lenB)//若长链表尾b则互换
    {
        longlist=headB;
        shortlist=headA;  
    }
    while(gap--)
    {
        longlist=longlist->next;
    }
    while(longlist!=shortlist)
    {
        longlist=longlist->next;
        shortlist=shortlist->next;
    }
    return longlist;
}

我们再OJ题的解题中可以发现,快慢指针的解题思路是非常重要的,大家可以多去做一点题 !
好了,今天的分享到这里就结束了,谢谢大家的支持!

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

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

相关文章

并查集总结

并查集简介 并查集是一种可以动态维护若干个不重叠的结合&#xff0c;并支持合并与查询的数据结构 并查集是一种树状的数据结构&#xff0c;可以用于维护传递关系以及联通性。 并查集有两种操作&#xff1a; find&#xff1a;查询一个元素属于哪个集合merge:合并两个集合 模…

前端入门(二)Vue2基本语法、样式渲染、数据代理与监测

文章目录 Vue简介Vue的特点Hello, Vue Vue基本语法模板语法数据绑定&#xff08;v-bind、v-model&#xff09;el与data的两种写法 事件处理&#xff08;v-on:click / click&#xff09;事件修饰符键盘事件&#xff08;缺&#xff09; 计算属性与监视&#xff08;computed、watc…

利用叉积计算向量的旋向及折线段的拐向

一、向量叉积 两个向量 u u u、 v v v的叉积写作 u v n ∥ u ∥ ∥ v ∥ s i n θ \mathbf{u \times v n \left \| u \right \| \left \| v \right \| sin\theta } uvn∥u∥∥v∥sinθ 式中&#xff0c; n n n: 与 u u u、 v v v均垂直的单位向量&#xff0c;theta是两向量…

Apache配置文件详解

引言: Apache是一种功能强大的Web服务器软件,通过配置文件可以对其行为进行高度定制。对于初学者来说,理解和正确配置Apache的配置文件是非常重要的。本文将详细解释Apache配置文件的各个方面,并给出一些入门指南,帮助读者快速上手。 1、主配置文件(httpd.conf): 主…

uni-app 使用uni.getLocation获取经纬度配合腾讯地图api获取当前地址

前言 最近在开发中需要根据经纬度获取当前位置信息&#xff0c;传递给后端&#xff0c;用来回显显示当前位置 查阅uni-app文档&#xff0c;发现uni.getLocation () 可以获取到经纬度&#xff0c;但是在小程序环境没有地址信息 思考怎么把经纬度换成地址&#xff0c;如果经纬度…

10月起个税系统升级,3个月个税零申报将收到提示

近日&#xff0c;自然人电子税务局扣缴端升级了&#xff0c;升级后对于工资薪金收入连续三个月为零的纳税人&#xff0c;系统会自动出现以下提示。这个提示主要为了避免企业长期对已经离职的员工进行零申报&#xff0c;导致数据不准确和资源浪费。HR在申报个税时&#xff0c;一…

18.天气小案例

1►新增带Layout组件的页面 直接在views文件夹下面新增weather.vue。然后随便写一个123&#xff0c;现在先让我们页面能跳过去先。 让页面能跳过去&#xff0c;有好几种方法&#xff1a; 1、在菜单管理自己添加一个菜单&#xff0c;然后把菜单分配给某个角色&#xff0c;再把…

瑞吉外卖优化

1.缓存问题 用户数量多&#xff0c;系统访问量大频繁访问数据库,系统性能下降,用户体验差 2.导入依赖 和配置 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependenc…

线程安全

文章目录 观察线程安全问题线程安全的概念出现线程安全问题的原因共享数据原子性总结 synchronized - 锁synchronized 特性互斥可重入 synchronized 的使用修饰普通方法修饰静态方法修饰代码块 解决线程安全问题两个线程两把锁哲学家就餐问题 - N个线程M把锁解决策略 死锁成因总…

回归算法优化过程推导

假设存在一个数据集&#xff0c;包含工资、年龄及贷款额度三个维度的数据。我们需要根据这个数据集进行建模&#xff0c;从而在给定工资和年龄的情况下&#xff0c;实现对贷款额度的预测。其中&#xff0c;工资和年龄是模型构建时的两个特征&#xff0c;额度是模型输出的目标值…

【NLP】GPT 模型如何工作

介绍 2021 年&#xff0c;我使用 GPT 模型编写了最初的几行代码&#xff0c;那时我意识到文本生成已经达到了拐点。我要求 GPT-3 总结一份很长的文档&#xff0c;并尝试了几次提示。我可以看到结果比以前的模型先进得多&#xff0c;这让我对这项技术感到兴奋&#xff0c;并渴望…

Linux 磁盘/分区/修复 命令

目录 1. lsblk&#xff08;list block devices&#xff09; 2. fdisk&#xff08;fragment disk&#xff09; 3. gdisk 4. mkfs&#xff08;make filesystem&#xff09; 5. df&#xff08;display file-system disk space usage&#xff09; 6. du 7. fsck&#xff08;file-sy…

千帆Llama 2中文增强技术介绍--SFT,预训练,指令优化

目录 千帆Llama 2中文增强技术介绍 SFT&#xff0c;预训练&#xff0c;指令优化 千帆Llama 2中文增强技术介绍 SFT&#xff0c;预训练&#xff0c;指令优化

JavaScript中的继承

前言 继承 1.借用构造函数继承也叫经典继承 2.原型链继承 3.组合继承 1 2 1.经典继承 借用构造函数实现继承 // 创建父构造函数 function Animal(type,weight,age,length){this.type type;this.weight weight;this.age age;this.length length; }; Animal.prot…

一个工具让你明白“万丈高楼平地起”,拒绝重复造轮子!

大家在公司工作当中是不是很多时间装环境很麻烦&#xff0c;一个项目要上线了&#xff0c;开始网上搜了一边又一遍的环境搭建教程&#xff1f;等到下一个项目要上线了&#xff0c;又上网上搜了一边又一遍的环境搭建教程。关键天花乱坠的互联网&#xff0c;找不到很靠谱的呀。有…

Python数据分析30w人都在看

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

深入了解Performance API:优化网页性能的利器

在现代Web开发中&#xff0c;优化网页性能是至关重要的。用户对于加载速度和交互性能的要求越来越高&#xff0c;而Performance API作为一组用于测量和监控网页性能的JavaScript接口&#xff0c;为开发者提供了丰富的工具和信息。本文将深入探讨Performance API的各个方面&…

2021年09月 Scratch(二级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch等级考试(1~4级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 执行下图所示程序,舞台上的角色? A:在1秒内滑行到随机位置 B:不断地重复滑行到随机位置 C:只有按下空格键的时候,才会滑行到随机位置 D:只有按下空格键以外键的时候,才会滑行…

SpringMVC问题

文章目录 SpringMVC运行流程MVC的概念与请求在MVC中的执行路径&#xff0c;ResponsBody注解的用途SpringMVC启动流程 SpringMVC运行流程 • 客户端&#xff08;浏览器&#xff09;发送请求&#xff0c;直接请求到 DispatcherServlet 。 • DispatcherServlet 根据请求信息调用 …

vscode-insiders Remote-SSH XHR failed无法访问远程服务器

问题概述&#xff1a; destFolder/home/apple/.vscode-server-insiders > destFolder2/vscode-cli-05cd2640ec8a106a4ee99cb38e6ee34fbec04f11.tar.gz > 194f252f7426:trigger_server_download_end > Waiting for client to transfer server archive... > W…