LeetCode 链表OJ分享

news2024/11/25 4:29:14

目录

  • 删除排序链表中的重复元素
  • 回文链表
  • 剑指Offer 06.从尾到头打印链表
  • 复制带随机指针的链表

删除排序链表中的重复元素

链接: link
题目描述:
在这里插入图片描述
题目思路:

本题思路使用双指针,以示例二为例如下图:
在这里插入图片描述

如果head->val等于next->val,那么此时就要删除重复节点next,具体步骤:
1、创建一个节点指针del记录被删除的节点next
2、next指针向下移动
3、free(del)
4、链接cur和next,cur->next=next

在这里插入图片描述

如果head->val不等于next->val,那么此时就要向下移动节点指针,具体步骤:
cur=next;
next=next->next

在这里插入图片描述

循环结束条件:当next指针指向空时,循环结束,返回链表的头

在这里插入图片描述

本题注意两点:
1、注意链表只有一个节点时,不做删除重复元素的操作,直接返回链表的头。
2、注意如果该链表为空链表,直接返回NULL。

代码实现:

struct ListNode* deleteDuplicates(struct ListNode* head)
{
    if(head==NULL)
    {
        return NULL;
    }
    if((head->next)==NULL)
    {
        return head;
    }
    struct ListNode* cur = head;
    struct ListNode* next = cur->next;
    while(next)
    {
        if(cur->val==next->val)
        {
            struct ListNode* del = next;
            next = next->next;
            cur->next = next;
            free(del);
        }
        else
        {
            cur=cur->next;
            next = next->next;
        }
    }
    return head;
}

回文链表

链接: link
题目描述:
在这里插入图片描述
题目思路:
本题主要核心步骤分为两三大步,第一步就是寻找中间节点,第二步逆置中间节点后的其他节点,第三步分别从头节点和中间节点开始,对比元素是否相等,如果相等为回文链表返回true,不相等返回false。

第一步:寻找中间节点
思路:快慢指针,快指针一次走两步,慢指针一次走一步

偶数节点循环结束条件分析:
循环结束条件为fast=NULL

在这里插入图片描述
在这里插入图片描述
奇数节点循环结束条件分析:
循环结束条件为fast->next=NULL

在这里插入图片描述
在这里插入图片描述
第一步代码实现:

struct ListNode* MiddleNode(struct ListNode* head)
 {
    struct ListNode* slow = head;
    struct ListNode* fast = head;
    while(fast&&fast->next)
    {
        slow=slow->next;
        fast = fast->next->next;
    }
    return slow;
 }

第二步:逆置中间节点后的节点
思路:改变链表指向,返回逆置后链表新的头

在这里插入图片描述
在这里插入图片描述

1、三个指针n1 n2 n3,逆置以下图为例

在这里插入图片描述

改变n2的指向,n2->next=n1

在这里插入图片描述

3个指针同时后移:n1=n2 n2=n3 n3=n3->next

在这里插入图片描述

循环上述步骤操作

循环结束条件分析:
本题循环结束条件为n2为空,但是n2为空的同时还要注意n3指针的空指针问题,如下图,n1到达最后一个节点,此时n2刚好为空,但是n3在上述迭代的情况下,下图的位置显然是不正确的。
在这里插入图片描述
此处应该注意加以判断n3是否为空,如果n3为空,则不再进行向下移动的迭代,最后返回n1,即为逆置后链表新的头。
在这里插入图片描述
第二步代码实现:

struct ListNode* reverseNode(struct ListNode* mid)
 {
     struct ListNode* n1 = NULL;
     struct ListNode* n2 = mid;
     struct ListNode* n3 = mid->next;
     while(n2)
     {
         n2->next = n1;
         //迭代
         n1=n2;
         n2=n3;
         if(n3)
         {
             n3=n3->next;
         }
     }
     return n1;
 }

第三步分别从头节点和中间节点开始,对比元素是否相等,如果相等为回文链表返回true,不相等返回false。

经过上述两个步骤的修改后,链表的形态如下图:
在这里插入图片描述
对比元素是否相等,循环结束条件:rmid!=NULL
代码实现:

struct ListNode* MiddleNode(struct ListNode* head)
 {
    struct ListNode* slow = head;
    struct ListNode* fast = head;
    while(fast&&fast->next)
    {
        slow=slow->next;
        fast = fast->next->next;
    }
    return slow;
 }
 struct ListNode* reverseNode(struct ListNode* mid)
 {
     struct ListNode* n1 = NULL;
     struct ListNode* n2 = mid;
     struct ListNode* n3 = mid->next;
     while(n2)
     {
         n2->next = n1;
         //迭代
         n1=n2;
         n2=n3;
         if(n3)
         {
             n3=n3->next;
         }
     }
     return n1;
 }
bool isPalindrome(struct ListNode* head)
{
    struct ListNode* mid = MiddleNode(head);
    struct ListNode* rmid = reverseNode(mid);
    struct ListNode* cur = head;
    while(rmid)
    {
        if(cur->val==rmid->val)
        {
            cur=cur->next;
            rmid=rmid->next;
        }
        else
        {
            return false;
        }
    }
    return true;
}

剑指Offer 06.从尾到头打印链表

链接: link
题目描述:
在这里插入图片描述
题目思路:

思路同上题: 1、逆置链表,改变链接方向
2、求出链表节点的个数returnSize
3、动态开辟数组,数组元素个数为
returnSize
4、释放动态开辟的内存空间

代码实现:

 int countList(struct ListNode* head)
 {
     int count=0;
     struct ListNode* cur = head;
     while(cur)
     {
         count++;
         cur=cur->next;
     }
     return count;
 }
 struct ListNode* reverseList(struct ListNode* head)
 {
     if(head==NULL)
     {
         return NULL;
     }
     if(head->next==NULL)
     {
         return head;
     }
     struct ListNode* n1 = NULL;
     struct ListNode* n2 = head;
     struct ListNode* n3 = head->next;
     while(n2)
     {
         n2->next = n1;
         n1 = n2;
         n2=n3;
         if(n3)
         {
            n3=n3->next;
         }
     }
     return n1;
 }
int* reversePrint(struct ListNode* head, int* returnSize)
{
    int ret = countList(head);
    *returnSize = ret;
    struct ListNode* newhead = reverseList(head);
    int * tmp = (int*)malloc(sizeof(int)*(*returnSize));
    if(tmp==NULL)
    {
        perror("malloc fail");
        return NULL;
    }
    struct ListNode* cur = newhead;
    int i = 0;
    while(i<ret&&cur)
    {
         tmp[i]=cur->val;
         cur=cur->next;
         i++;
    }
    return tmp;
    free(tmp);
    tmp=NULL;
}

复制带随机指针的链表

链接: link
题目描述:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
题目思路:
1、拷贝节点插入到原节点后面
在这里插入图片描述
步骤:

1、画图明确拷贝节点和原节点

在这里插入图片描述

2、动态开辟一个内存空间存放拷贝节点
struct Node* copy=(struct Node*)malloc(sizeof(struct Node));
将原节点的值赋值给拷贝节点 copy->val=cur->val

3、链接拷贝节点

在这里插入图片描述

4、循环条件:cur!=NULL,循环进行上述步骤

2、控制拷贝节点的random:copy->random=cur->random->next;
在这里插入图片描述
步骤:

1、此时copy节点就在cur节点的后面,cur->next = copy

在这里插入图片描述

2、如果cur原节点的random为空,那么拷贝节点的random也为空

在这里插入图片描述

3、如果原节点的random不为空,拷贝节点的random和原节点的random相等,copy->random=cur->random->next;拷贝节点的random在原节点random的下一个节点。

在这里插入图片描述

4、迭代向下,cur=copy->next

3、拷贝节点从原链表上解下来尾插形成新的链表,并且恢复原链表(具体看图实现)
步骤:

1、将拷贝节点尾插到新的链表

在这里插入图片描述

2、恢复原链表(依次按原链表链接)

在这里插入图片描述

struct Node* copyRandomList(struct Node* head) 
{
    //1、将拷贝节点链接到原节点的后面
    struct Node* cur = head;
    while(cur)
    {
        struct Node* copy = (struct Node*)malloc(sizeof(struct Node));
        copy->val=cur->val;
        //链接
        struct Node* next = cur->next;
        cur->next = copy;
        copy->next = next;
        cur=next;
    }
    //2、控制拷贝节点的random
    cur = head;
    while(cur)
    {
        struct Node* copy = cur->next;
        if(cur->random==NULL)
        {
            copy->random=NULL;
        }
        else
        {
            copy->random=cur->random->next;
        }
        cur=copy->next;
    }
    //3、尾插新链表,恢复原链表
    cur = head;
    struct Node* copyHead = NULL,* copyTail = NULL;
    while(cur)
    {
        struct Node* copy = cur->next;
        struct Node* next = copy->next;
        if(copyHead==NULL)
        {
            copyHead = copyTail=copy;
        }
        else
        {
            copyTail->next = copy;
            copyTail=copyTail->next;
        }
        //恢复原链表
        cur->next = next;
        cur= next;

    }
    return copyHead;
	
}

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

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

相关文章

ihateniggers:针对Python开发者的Windows远控木马分析

背景 墨菲安全实验室在持续监测开源软件仓库中的投毒行为&#xff0c;5 月 9 日起发现 4 个包含 “ihateniggers” 远程控制木马的 Python 包被 nagogygmail.com 邮箱关联的账号发布到 PyPI 仓库&#xff0c;试图针对Windows系统下 Python 开发者进行攻击。木马利用了discord、…

各种顺序表和链表的实现代码

目录 一、什么是线性表 二、顺序表 2.1什么是顺序表 2.2静态顺序表的代码实现 2.3动态顺序表的代码实现 三、链表 3.1什么是链表 3.2不带头单向不循环链表的代码实现 3.3带头双向循环链表的代码实现 四、顺序表和链表的区别 一、什么是线性表 线性表是n个具有相同特性…

(十五)数据编辑——图形编辑①

数据编辑——图形编辑① 数据编辑包括几何数据和属性数据的编辑。几何数据的编辑主要是针对图形的操作&#xff0c;即图形编辑&#xff0c;包括平行线复制、缓冲区生成、镜面反射、图层合并、结点操作、拓扑编辑等。属性编辑主要包括图层要素属性的添加、删除、修改、复制、粘…

谷歌落子,我们对中国大模型的期待应该是什么?

对中国大模型厂商而言&#xff0c;市场期待的&#xff0c;也恰是这些真正可落地的应用和实践。这些实践可以在社交&#xff0c;在电商&#xff0c;在低代码&#xff0c;在供应链&#xff0c;也更可以在一个个中国产业数字化转型的新洼地。 作者|思杭 皮爷 出品|产业家 在微软G…

裸辞5个月,面试了37家公司,终于.....

上半年裁员&#xff0c;下半年裸辞&#xff0c;有不少人高呼裸辞后躺平真的好快乐&#xff01;但也有很多人&#xff0c;裸辞后的生活五味杂陈。 面试37次终于找到心仪工作 因为工作压力大、领导PUA等各种原因&#xff0c;今年2月下旬我从一家互联网小厂裸辞&#xff0c;没想…

执行增删改查时的结果处理

查询最终走到PreparedStatementHandler类的query方法&#xff0c;执行查询后调用DefaultResultSetHandler类的handleResultSets方法 1.处理返回的普通实体类 DefaultResultSetHandler类的handleResultSets方法 继续本类的handleResultSet方法 通过 handleRowValues 方法来…

设计一个可靠的自动化测试框架需要考虑哪些问题呢?

随着软件开发的日益普及&#xff0c;自动化测试框架逐渐成为了保障软件质量的必备工具。然而&#xff0c;如何设计一个可靠的自动化测试框架并不是一件简单的事情&#xff0c;需要考虑多方面的问题。本文将从需求分析、架构设计、测试用例编写等多个角度&#xff0c;介绍设计一…

【SpringMVC】| SpringMVC拦截器

目录 一&#xff1a;SpringMVC拦截器 1. 拦截器介绍 2. HandlerInterceptor接口分析 3. 自定义拦截器实现权限验证 一&#xff1a;SpringMVC拦截器 SpringMVC 中的 Interceptor 拦截器&#xff0c;它的主要作用是拦截指定的用户请求&#xff0c;并进行相应的预处理与后处理…

C++面向对象(黑马程序员)

内存分区模型 #include<iostream> using namespace std;//栈区数据注意事项&#xff1a;不要返回局部变量的地址 //栈区的数据由编译器管理开辟和释放int* func(int b) //形参数据也会放在栈区 {b 100;int a 10; //局部变量存放在栈区&#xff0c;栈区的数据在函数执…

Qt创建项目 No suitable kits found.

最近因为要写.net6项目&#xff0c;而更新了Visual Studio&#xff0c;后来再使用Qt的时候发现不能编译了。 调整后&#xff0c;发现新建项目显示“No suitable kits found”错误。 网上也看了很多的解决方案&#xff0c;但都不得要领&#xff0c;也都没有解决。 ----------…

Java-Redis持久化之AOF操作

Java-Redis持久化之AOF操作 1.AOF(append only file)2.请你用自己的话说一说 AOF的过程?3.配置如何开启AOF操作4.AOF的优点和缺点: 1.AOF(append only file) 将我们所有的命令都记录下来保存到文件&#xff0c;恢复的时候把这个文件都执行一遍。 2.请你用自己的话说一说 AOF…

【Vue】学习笔记-全局事件总线

全局事件总线(GlobalEventBus) 一种可以在任意组件通信的方式&#xff0c;本质上就是一个对象&#xff0c;它必须满足以下条件 所有的组件对象都必须能看见他这个对象必须能够使用$ on $ emit $ off方法取绑定、触发和解绑事件 使用步骤 定义全局事件总线 //创建VUE new V…

WPF中的用户控件和自定义控件详解

总目录 文章目录 总目录一、什么是用户控件和自定义控件1 用户控件和自定义控件2 相关知识点2 用户控件和自定义控件的适用场景 二、用户控件的使用1.通过依赖属性和路由事件封装用户控件的案例2.通过依赖属性命令依赖属性封装用户控件的案例3.只对外提供属性不对外提供操作的用…

USBCAN卡和台达AS228T通信

AS228R 如图 A.把CAN卡固定上 B.接一个120欧的终端电阻 C.把来可的USBCAN卡的CANH和CANL分别接入AS228R的CANH和CANL. CAN 接口及网络拓扑 10.2.4.1 CAN 网络实体信号的定义及数据格式 CAN 信号为差分信号&#xff0c;信号电压为 CAN和 CAN-之间的电压差&#xff0c;CAN 和…

怎样删除hao123(浏览器首页被篡改了)

有时候我们打开浏览器发现首页被hao123 ,或者2345 这些浏览器给篡改了 或者打开的时候直接打开2个.这个时候想要删除它们,其他它们本身就是网页的,没有应用 在卸载的地方就不用了,它们就嵌套你的浏览器里面,打开的时候启动了他们, 下面说下方法 1 查看浏览器在什么方法下载…

第3天学习Docker-Docker部署常见应用(MySQL、Tomcat、Nginx、Redis、Centos)

前提须知&#xff1a; &#xff08;1&#xff09;搜索镜像命令 格式&#xff1a;docker search 镜像名 &#xff08;2&#xff09;设置Docker镜像加速器 详见文章&#xff1a;Docker设置ustc的镜像源&#xff08;镜像加速器&#xff09; 1、部署MySQL 拉取镜像&#xff08;这…

Radius:针对Rollup生态的Trustless Shared Sequencing层

1. 引言 前序博客&#xff1a; Rollup去中心化Rollup DecentralizationAztec 征集 Rollup Sequencer去中心化提案 Rollup中单一中心化sequencer的问题在于&#xff1a; 审查MEV extraction MEV extraction的问题不在于中心化本身&#xff0c;而在于sequencer具有操纵交易顺…

CN学术期刊《西部素质教育》简介及投稿邮箱

《西部素质教育》&#xff08;半月刊&#xff09;创刊于2015年&#xff0c;是由青海人民出版社有限责任公司主管/主办的教育类学术期刊&#xff0c;本刊恪守“追踪教育研究前沿&#xff0c;关注教育实践热点&#xff0c;探索创新教育理念&#xff0c;传播教育教学信息&#xff…

测试外包干了4年,我废了...

这是来自一位粉丝的投稿内容如下&#xff1a; 先说一下自己的个人情况&#xff0c;大专毕业&#xff0c;18年通过校招进入湖南某外包公司&#xff0c;干了接近4年的软件测试外包工作&#xff0c;马上2023年秋招了&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在…

JOSEF 约瑟 JZ-7Y-E/06静态中间继电器 拓展端子 接线牢固

​ JZ-7Y-E/06静态中间继电器品牌:JOSEF约瑟名称:静态中间继电器型号:JZ-7Y-E/06额定电压:6220VDC&#xff1b;6380VAC触点容量:10A/250V10A/220VDC功率消耗:≤6W JZ-7Y-E/06静态中间继电器 系列型号&#xff1a; JZ-7Y-E/60静态中间继电器&#xff1b; JZ-7J-E/60…