广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++相交链表和反转链表详解
  • 241
分享到

C++相交链表和反转链表详解

2024-04-02 19:04:59 241人浏览 安东尼
摘要

目录给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。思路给你单链表的头节点 head ,请你反转

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。

在这里插入图片描述

思路

简单来说,就是求两个链表交点节点的 指针。 这里同学们要注意,交点不是数值相等,而是指针相等。

为了方便举例,假设节点元素数值相等,则节点指针相等。

看如下两个链表,目前curA指向链表A的头结点,curB指向链表B的头结点:

在这里插入图片描述

我们求出两个链表的长度,并求出两个链表长度的差值,然后让curA移动到,和curB 末尾对齐的位置,如图:

在这里插入图片描述

此时我们就可以比较curA和curB是否相同,如果不相同,同时向后移动curA和curB,如果遇到curA == curB,则找到焦点。

否则循环退出返回空指针。



class Solution {
public:
    Listnode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        ListNode* curA=headA;
        ListNode* curB=headB;
        int lenA=0;
        int lenB=0;
        while(curA!=nullptr){  // 求链表A的长度
            lenA++;
            curA=curA->next;
        }
        while(curB!=nullptr){  // 求链表B的长度
            lenB++;
            curB=curB->next;
        }
        //现在的curA,curB已经指向最后一个节点了,需要重新指向头结点
        curA=headA;
        curB=headB; 
        if(lenA<lenB){  //假设链表A的长度大于链表B,否则交换
            swap(lenA,lenB);
            swap(curA,curB);
        }
        //gap是两个链表长度的差值
        int gap=lenA-lenB; // gap=lenA-lenB 错误,要有返回类型
        while(gap){     // 让curA和curB在同一起点上(末尾位置对齐)
            gap--;
            curA=curA->next;  
        }
        while(lenB){   // 遍历curA 和 curB,遇到相同则直接返回
            if(curA==curB)
                return curA; // return curA(val) 返回节点中的值,这个写法是错误的  直接return curA
            curA=curA->next;
            curB=curB->next;
            lenB--;
        } 
        return nullptr;  //没有交点则返回空
    }
};

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

示例 1:

输入:head = [1,2,3,4,5]

输出:[5,4,3,2,1]

示例 2:

输入:head = [1,2]

输出:[2,1]

示例 3:

输入:head = []

输出:[]

双指针思路

首先判断链表是否为空,为空则返回nullptr。

接下来定义一个cur指针,指向头结点,再定义一个pre指针,初始化为null。

然后就要开始反转了,首先要把 cur->next 节点用tmp指针保存一下,也就是保存一下这个节点。

为什么要保存一下这个节点呢,因为接下来要改变 cur->next 的指向了,将cur->next 指向pre ,此时已经反转了第一个节点了。

接下来,就是循环走如下代码逻辑了,继续移动pre和cur指针。

最后,cur 指针已经指向了null,循环结束,链表也反转完毕了。 此时我们return pre指针就可以了,pre指针就指向了新的头结点。



class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        if(head==nullptr)  //对空链表的判断
            return nullptr;
        ListNode* per=nullptr;
        ListNode* cur=head;
        ListNode* temp; //建立一个指针
        while(cur){  //没必要写 while(cur!=nullptr),写了这个还要判断cur,会浪费时间,直接cur就可以
            temp=cur->next; //保存cur的下一个节点
            cur->next=per; //cur的下一个节点指向per,实现反转
            per=cur;  //cur=per;错误,是把cur的节点赋值给per
            cur=temp; //temp=cur;错误,是把temp(原来的cur->next)的节点赋值给cur
        }
        return per;
    }
};

递归



class Solution {
public:
    ListNode* reverse(ListNode* per,ListNode* cur){  //返回的是一个链表,其返回值是指针
        if(cur==nullptr)  //递归的终止条件
            return per;
        ListNode* temp=cur->next;
        cur->next=per;
        return reverse(cur,temp); // 调用要写return
    }
    ListNode* reverseList(ListNode* head) {
        if(head==nullptr) //链表判空
            return nullptr; 
        return reverse(NULL,head); // 调用要写return
    }
};

总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注编程网的更多内容!

--结束END--

本文标题: C++相交链表和反转链表详解

本文链接: https://www.lsjlt.com/news/133011.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++相交链表和反转链表详解
    目录给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。思路给你单链表的头节点 head ,请你反转...
    99+
    2022-11-12
  • C语言链表与单链表详解
    链表是什么及链表的优势 链表是一种介于数组的另外一种数据结构: 我们知道数组可以存放很多的元素,这些元素都是呈线性排列,也就是一个挨着一个连续存放 但是当元素足够多时,还能继续正常的...
    99+
    2022-11-13
  • web数组与链表到单链表的反转怎么理解
    本篇内容主要讲解“web数组与链表到单链表的反转怎么理解”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“web数组与链表到单链表的反转怎么理解”吧!数组与链表数组最大的一个特点就是,需要一块连续的...
    99+
    2023-06-16
  • C语言数据结构之双链表&循环链表&静态链表详解
    目录单链表 VS 双链表双链表双链表的初始化(带头结点)双链表的插入双链表的删除双链表的遍历循环单链表循环双链表循环双链表的初始化循环双链表的插入循环双链表的删除静态链表什么是静态链...
    99+
    2022-11-13
  • C++实现反转链表的两种方法
    目录一.使用vector容器二.调整指针法大家好,今天和大家分享的是反转链表的两种方法,第一种是用泛型编程里面的STL,第二种是利用多个指针进行操作,小孩子才做选择,建议两个都学。我...
    99+
    2023-02-09
    C++ 反转链表
  • 详解C语言之单链表
    目录一、思路步骤1. 定义结构体2.初始化3.求当前数据元素的个数4.插入5.删除6.释放内存空间二、代码总结 一、思路步骤 1. 定义结构体 a.数据域:用来存放数据 b.指针域...
    99+
    2022-11-12
  • c语言单链表反转代码怎么写
    以下是一个简单的C语言单链表反转代码示例: #include #include // 定义链表节点结构体 typedef st...
    99+
    2023-10-26
    c语言
  • Golang判断两个链表是否相交的方法详解
    目录算法题:判断2个链表相交方法一:map方法二:首尾相接法算法题:判断2个链表相交 面试中可能会问到的算法题,今天总结一下 方法一:map 步骤: 1.遍历list1,以节点为ke...
    99+
    2023-03-14
    Golang判断链表是否相交 Golang判断链表相交 Golang链表相交
  • C语言线性表之双链表详解
    目录定义1.删除2.插入3.建立4.查找总结定义 链表是通过一组任意的存储单元来存储线性表中的数据元素,每一个结点包含两个域:存放数据元素信息的域称为数据域,存放其后继元素地址的域称...
    99+
    2022-11-13
  • 怎么理解Java递归单链表反转
    这篇文章主要讲解了“怎么理解Java递归单链表反转”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解Java递归单链表反转”吧!首先,咱们要先明确,什么...
    99+
    2022-10-19
  • C++数据结构之链表详解
    目录前言一、删除链表中给定值为key的节点二、反转链表三、返回链表的中间节点四、删除链表的倒数第K个节点五、分割链表六、合并两个有序链表七、删除有序链表中重复节点八、环形链表九、相交...
    99+
    2022-11-12
  • C++详解如何实现单链表
    目录单链表单链表的基本操作1.初始化2.取值3.查找4.插入5.删除示例代码开发环境运行结果单链表 链表内存空间不一定连续,其扩展性较好。多余的不多说了。该文主要记录单链表的实现,该...
    99+
    2022-11-13
  • C语言类的双向链表详解
    目录前言双向链表的定义双向链表的创建节点的创建双向链表节点查找双向链表的插入双向链表的节点删除双向链表的删除总结前言 链表(linked list)是一种这样的数据结构,其中的各对象...
    99+
    2022-11-12
  • 详解C++实现链表的排序算法
    目录一、链表排序二、另外一种链表排序方式三、比较两种排序的效率四、下面通过交换结点实现链表的排序一、链表排序 最简单、直接的方式(直接采用冒泡或者选择排序,而且不是交换结点,只交换数...
    99+
    2022-11-12
  • C++超详细讲解单链表的实现
    目录单链表的实现(从入门到熟练)概念和结构链表的实现增删查改接口节点结构体创建节点开辟数据打印链表尾插数据头删链表数据查找链表pos位置前插数据链表pos位置后插数据链表pos位置数...
    99+
    2022-11-13
  • C语言实现无头单链表详解
    目录链表的结构体描述(节点)再定义一个结构体(链表) 断言处理 & 判空处理创建链表创建节点头插法打印链表尾插法 指定位置插入 头删法尾删法&n...
    99+
    2022-11-13
  • C语言链表详解及代码分析
    目录什么是链表环境构建建立静态链表包含所需要的头文件宏定义相关变量创建一个结构体主函数结果展示说明建立动态链表包含所需要的头文件宏定义相关变量创建一个结构体建立链表函数主函数结果展示...
    99+
    2022-11-12
  • C语言线性表的链式表示及实现详解
    目录前言代码实现1. 单链表的结点构造2. 构造一个空的头结点3. 对线性表进行赋值4.对线性表进行销毁5.对线性表进行重置6.判断线性表是否为空7.获取线性表的长度8.获取线性表某...
    99+
    2022-11-13
  • C语言学习之链表的实现详解
    目录一、链表的概念二、链表的结构三、顺序表和链表的区别和联系四、链表的实现一、链表的概念 链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次...
    99+
    2022-11-13
    C语言 链表实现 C语言 链表
  • C++ 数据结构超详细讲解单链表
    目录前言一、链表是什么链表的分类二、链表的实现总结(❁´◡`❁) 单链表 前言 上篇顺序表结尾了解了顺序表的诸多缺点,链表的特性很好的解决了这些问题,本期我们来认识单链表...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作