【数据结构练习】单链表OJ题(一)

目录

    • 一、移除链表元素
      • 思路1:
      • 思路2:
    • 二、反转链表
    • 三、链表的中间节点
    • 四、链表中倒数第k个节点
    • 五、回文结构
    • 六、合并两个有序链表

一、移除链表元素

题目:
在这里插入图片描述

思路1:

在原来的链表上进行修改,节点的数据是val的删除,然后前后再连接起来。

需要考虑的因素:
1.要删除的节点位置在第一个节点;
2.要删除的节点位置在中间任意一个节点;
3.要删除的节点位置在最后一个节点

用一个变量cur遍历链表,要删除的节点是头节点,就是头删;是中间的某个节点就把要删除的节点free释放,然后连接前后的节点(定义另一个变量prev为cur的前一个);是最后一个节点,就是尾删,但是这里的尾删与中间某个节点删除是一样的。

struct ListNode* removeElements(struct ListNode* head, int val)
{
    struct ListNode* cur=head;
    struct ListNode* prev=NULL;
    while(cur)
    {
        if(cur->val==val)
        {
            if(cur==head)
            {
                head=cur->next;
                free(cur);
                cur=head;
            }
            else
            {
                prev->next=cur->next;//cur是尾节点next就是空
                free(cur);
                cur=prev->next;
            }
        }
        else
        {
            prev=cur;
            cur=prev->next;
        }
    }
    return head;
}

思路2:

将不是要移除的元素连接到新的链表

这里我们要定义一个新的头指针(newhead),还要一个变量cur去遍历原链表,找不是要移除的元素;再定义一个变量tail使每次插入的新节点链接起来。

注意:在最后要把tail的next置空,因为尾节点的next必须指向空指针

struct ListNode* removeElements(struct ListNode* head, int val)
{
    struct ListNode* cur = head;
    struct ListNode* newhead=NULL;
    struct ListNode* tail = newhead;
    while(cur)
    {
        if(cur->val==val)
        {
            cur=cur->next;
        }
        else
        {
            if(tail==NULL)
            {
                newhead=tail=cur;
            }
            else
            {
                tail->next=cur;
                tail=tail->next;
            }
            cur=cur->next;
        }
    }
    if(tail)
    {
        tail->next=NULL;
    }
    return newhead;
}

二、反转链表

题目:
在这里插入图片描述
采用头插法

定义一个新的头指针newhead指向NULL,用一个变量cur遍历原链表,再定义一个变量del为cur的下一个节点(这样cur循环一次可以到原来链表的下一个节点)。头插时,让cur的next指向newhead,再把newhead移到cur的位置上去,直到把原链表的所有节点头插完,返回的newhead就是原链表的反转。

在这里插入图片描述

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

三、链表的中间节点

题目:
在这里插入图片描述
快慢指针法

定义两个指针变量fast(快指针)和slow(慢指针),快指针一次走两步,慢指针一次走一步。当快指针或者快指针的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个节点

题目:
在这里插入图片描述
快慢指针相对距离法

定义两个指针变量fast和slow,先让fast走k步(如果fast已经为空k还没结束就返回空),然后fast和slow一起走(速度相同),当fast为空时跳出循环,此时的slow就是倒数第k个节点。

在这里插入图片描述

struct ListNode* FindKthToTail(struct ListNode* pListHead, int k )
{
    struct ListNode* slow = pListHead;
    struct ListNode* fast = pListHead;
    while(k)//先走k步
    {
        if(fast==NULL)
        {
            return NULL;
        }
        fast=fast->next;
        k--;
    }
    while(fast!=NULL)//相对距离
    {
        fast=fast->next;
        slow=slow->next;
    }
    return slow;
}

五、回文结构

题目:
在这里插入图片描述
这道题其实是前面两个题的综合
采用找中间节点和反转链表,然后比较是否回文

先找到中间节点,然后在这个中间节点开始反转后面的节点,比较从头节点开始到中间节点的个数,如果相同,就是回文,返回true;否则返回false。

在这里插入图片描述

class PalindromeList {
public:
    ListNode* find(ListNode* head)
    {
        ListNode* slow=head;
        ListNode* fast=head;
        while(fast&&fast->next)
        {
            slow=slow->next;
            fast=fast->next->next;
        }
        return slow;
    }
    ListNode* reverse(ListNode* head)
    {
        ListNode* newhead=NULL;
        ListNode* cur=head;
        while(cur)
        {
            ListNode* del=cur->next;
            cur->next=newhead;
            newhead=cur;
            cur=del;
        }
        return newhead;
    }
    bool chkPalindrome(ListNode* head) {
        ListNode* rid=find(head);
        ListNode* mrid=reverse(rid);
        ListNode* cur=head;
        while(cur!=rid)
        {
            if(cur->val!=mrid->val)
            {
                return false;
            }
            cur=cur->next;
            mrid=mrid->next;
        }
        return true;
    }
};

六、合并两个有序链表

题目:
在这里插入图片描述
两个链表的节点从头开始比较,取小的尾插到新链表;如果有一个链表的节点还没尾插完,就直接将这个链表的剩余节点尾插到新链表去。

如果刚开始有某个链表为空,就直接返回另一个链表
在这里插入图片描述

struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2)
{
    if(list1==NULL)
    {
        return list2;
    }
    if(list2==NULL)
    {
        return list1;
    }
    struct ListNode* head=NULL;
    struct ListNode* tail=NULL;
    while(list1&&list2)
    {
        if(list1->val<=list2->val)
        {
            if(tail==NULL)
            {
                head=tail=list1;
            }
            else
            {
                tail->next=list1;
                tail=tail->next;
            }
            list1=list1->next;
        }
        else
        {
            if(tail==NULL)
            {
                head=tail=list2;
            }
            else
            {
                tail->next=list2;
                tail=tail->next;
            }
            list2=list2->next;
        }
    }
    if(list1)
    {
        tail->next=list1;
    }
    if(list2)
    {
        tail->next=list2;
    }
    return head;
}

在这里插入图片描述
感谢观看~

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

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

相关文章

axios 各种方式的请求 示例

GET请求 示例一&#xff1a; 服务端代码 GetMapping("/f11") public String f11(Integer pageNum, Integer pageSize) {return pageNum " : " pageSize; }前端代码 <template><div class"home"><button click"getFun1…

时序预测 | MATLAB实现ELM极限学习机时间序列预测(多指标、相关图)

时序预测 | MATLAB实现ELM极限学习机时间序列预测(多指标、相关图) 目录 时序预测 | MATLAB实现ELM极限学习机时间序列预测(多指标、相关图)效果一览基本介绍程序设计学习总结参考资料效果一览 基本介绍 时序预测 | MATLAB实现ELM极

linux部署clickhouse(单机)

一、下载安装 1.1、下载地址 阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区阿里巴巴开源镜像站&#xff0c;免费提供Linux镜像下载服务&#xff0c;拥有Ubuntu、CentOS、Deepin、MongoDB、Apache、Maven、Composer等多种开源软件镜像源&#xff0c;此外还提供域名解析DNS、…

Android企业项目开发实训室建设方案

一 、系统概述 Android企业项目开发作为新一代信息技术的重点和促进信息消费的核心产业&#xff0c;已成为我国转变信息服务业的发展新热点&#xff1a;成为信息通信领域发展最快、市场潜力最大的业务领域。互联网尤其是移动互联网&#xff0c;以其巨大的信息交换能力和快速渗透…

JVM——JDK 监控和故障处理工具总结

文章目录 JDK 命令行工具jps:查看所有 Java 进程jstat: 监视虚拟机各种运行状态信息 jinfo: 实时地查看和调整虚拟机各项参数jmap:生成堆转储快照**jhat**: 分析 heapdump 文件**jstack** :生成虚拟机当前时刻的线程快照 JDK 可视化分析工具JConsole:Java 监视与管理控制台连接…

Flink内核源码解析--Flink中重要的工作组件和机制

Flink内核源码 1、掌握Flink应用程序抽象2、掌握Flink核心组件整体架构抽象3、掌握Flink Job三种运行模式4、理解Flink RPC网络通信框架Akka详解5、理解TaskManager为例子&#xff0c;分析Flink封装Akka Actor的方法和整个调用流程6、理解Flink高可用服务HighAvailabilityServ…

【二分查找篇】速刷牛客TOP101 高效刷题指南

文章目录 17、BM17 二分查找-I18、BM18 二维数组中的查找19、BM19 寻找峰值20、BM20 数组中的逆序对21、BM21 旋转数组的最小数字22、BM22 比较版本号23、BM23 二叉树的前序遍历 17、BM17 二分查找-I 思路步骤&#xff1a; step 1&#xff1a;从数组首尾开始&#xff0c;每次取…

微服务中间件--分布式事务

分布式事务 a.理论基础1) CAP定理2) BASE理论 b.Seata1) XA模式1.a) 实现XA模式 2) AT模式3) TCC模式3.a) 代码实现 4) Saga模式5) 四种模式对比6) TC的异地多机房容灾架构 a.理论基础 1) CAP定理 分布式系统有三个指标&#xff1a; Consistency&#xff08;一致性&#xff…

GRPC 链接 NODE 和 GOLANG

GRPC 链接 NODE 和 GOLANG GRPC 了解 什么是GRPC gRPC 采用了 Protocol Buffers 作为数据序列化和反序列化的协议&#xff0c;可以更快速地传输数据&#xff0c;并支持多种编程语言的跨平台使用gRPC 提供“统一水平层”来对此类问题进行抽象化。 开发人员在本机平台中编写专…

使用本地电脑搭建可以远程访问的SFTP服务器

文章目录 1. 搭建SFTP服务器1.1 下载 freesshd 服务器软件1.3 启动SFTP服务1.4 添加用户1.5 保存所有配置 2. 安装SFTP客户端FileZilla测试2.1 配置一个本地SFTP站点2.2 内网连接测试成功 3. 使用cpolar内网穿透3.1 创建SFTP隧道3.2 查看在线隧道列表 4. 使用SFTP客户端&#x…

WXML中的条件语句

wx:if 和 hidden 的使用 1.在js中定义数据 Page({ data:{ type:1,flag: false}, }) 2.在wxml中使用wx:if 和 hidden&#xff0c; block用于包装组件(不会渲染为任何标签) <!-- 条件渲染 --><view wx:if"{{type 1}}">男</view><view wx:elif…

Wappalyzer - 技术剖析工具的必备浏览器扩展

目录 前言一、Wappalyzer简介1.Wappalyzer的背景和由来2.Wappalyzer的目标和优势 二、Wappalyzer的工作原理1.检测技术栈的方法和策略2.数据库和规则集的更新 三、如何使用Wappalyzer1.安装Wappalyzer浏览器扩展2.在浏览器中使用Wappalyzer进行技术剖析 总结 前言 在当今的数字…

很好的启用window10专业版系统自带的远程桌面

启用window10专业版系统自带的远程桌面 文章目录 启用window10专业版系统自带的远程桌面前言1.找到远程桌面的开关2. 找到“应用”项目3. 打开需要远程操作的电脑远程桌面功能 总结 前言 Windows操作系统作为应用最广泛的个人电脑操作系统&#xff0c;在我们身边几乎随处可见。…

SpringBoo t+ Vue 微人事 (十一)

职位修改操作 在对话框里面做编辑的操作 添加对话框 <el-dialogtitle"修改职位":visible.sync"dialogVisible"width"30%"><div><el-tag>职位名称</el-tag><el-input size"small" class"updatePosIn…

Linux学习之ssh和scp

ls /etc/ssh可以看到这个目录下有一些文件&#xff0c;而/etc/ssh/ssh_config是客户端配置文件&#xff0c;/etc/ssh/sshd_config是服务端配置文件。 cat -n /etc/ssh/sshd_config | grep "Port "可以看一下sshd监听端口的配置信息&#xff0c;发现这个配置端口是22…

ubuntu 编译安装nginx及安装nginx_upstream_check_module模块

如果有帮助到你&#xff0c;麻烦点个赞呗&#xff5e; 一、下载安装包 # 下载nginx_upstream_check_module模块 wget https://codeload.github.com/yaoweibin/nginx_upstream_check_module/zip/master# 解压 unzip master# 下载nginx 1.21.6 wget https://github.com/nginx/…

无涯教程-PHP - 循环语句

PHP中的循环用于执行相同的代码块指定的次数。 PHP支持以下四种循环类型。 for - 在代码块中循环指定的次数。 while - 如果且只要指定条件为真&#xff0c;就会循环遍历代码块。 do ... while - 循环执行一次代码块&#xf…

损失函数,基于概率分布度量的损失函数,信息量,信息熵的作用

目录 损失函数中为什么要用Log&#xff1a;概率损失函数-乘法转加法-便于求偏导 信息量&#xff0c;信息熵的作用 信息的作用是消除不确定性&#xff1a;信息量是0&#xff0c;事件确定 回答只是Y,N&#xff0c;因此对数底数为2​编辑 一句话描述的事件发生的概率越低&#…

STM32--ADC模数转换

文章目录 ADC简介逐次逼近型ADCADC框图转换模式数据对齐转换时间校准ADC基本结构ADC单通道工程代码&#xff1a; ADC简介 STM32的ADC&#xff08;Analog-Digital Converter&#xff09;模拟-数字转换器&#xff0c;是一种逐次逼近型模拟数字转换器&#xff0c;可以将引脚上连续…

C++中机器人应用程序的行为树(ROS2)

马库斯布赫霍尔茨 一、说明 以下文章为您提供了对机器人应用程序或框架中经常使用的行为树的一般直觉&#xff1a;ROS&#xff0c;Moveit和NAV2。了解行为 Tress &#xff08;BT&#xff09; 框架的原理为您提供了在游戏领域应用知识的绝佳机会。BT可以与Unity或Unreal集成。 由…
最新文章