`
zxxapple
  • 浏览: 79578 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

关于链表追赶--链表中环的问题

阅读更多

关于环的问题,

介绍几个个经典的题目:

1.求链表倒数第k个结点

 

最经典,最常见的解法就是,设置两个指针p1,p2,一开始分别指向头结点,首先p2先移动k个节点,之后开始p1,p2每次移动1个节点,直到p2达到最后一个节点位置,那么p1指向的就是倒数第k个节点。

 

不过这种解法主要是针对单链表,且链表中不存在环的,如果是双向链表,或者是存在环的链表呢?

在判断是否在最后一个节点上就会出现问题了,ps.循环链表中判断最后一个节点就需要查看其pre指针指向的节点是否是刚才遍历过的节点。对于存在环的节点判断最后一个节点就有点麻烦了:

 

判断一个链表是否存在环

 

环的定义如上:

 

定义两个指针,开始的时候分别指向head,之后p1每次移动一个节点,p2每次移动两个节点,如果p2遇到null 的时候,不存在换否在p1,p2肯定在环内相遇。当p1==p2的时候,退出,存在环

 

判断两个链表是否相交

 

对于这个问题,这里的相交不会存在“X”的相交,而是“Y”形状的相交。

 

解法一

使用两个for循环来同时遍历两个数组,来发现首个相同的节点,不过时间复杂度会达到O(M*N)

 

解法二

使用hash表存储第一个链表的所有元素,通过遍历第二个链表,检查是否相同的节点在hash表中,有的话则说明两个链表有相同的子序列,否则就没有。时间复杂度为O(M+N),空间复杂度为O(M),不是很理想

 

解法三

如果链表相交则链表的最后一个节点一定是相同的,我们只需要判断最后一个节点是否相同即可。时间复杂度为O(M+N),空间复杂度减少到O(1)

 

当然上述几种方法都是建立在无环链表的基础之上的。

所以总结如下解决办法:

1.先判断带不带环
2.如果都不带环,就判断尾节点是否相等
3.如果都带环,判断第一个链表上是否存在环时---俩指针相遇(在环中相遇)的那个节点,在不在另一条链表上。如果在,则相交,如果不在,则不相交。

 

判断一个存在环的链表的环的第一个节点

 

在网上看到一个解决办法,类似龟兔赛跑的原理,定义两个指针p1,p2。p2一直向前走,p1,也是向前走,每走一步检查下是否赶上p2,如果赶上了,就从头再跑,此时p2向前走一步,如果没赶上,则继续往前走,此时p2停下等待,如此循环,直到,p1==p2->next,此时p2计时所求的点。

 

求两个相交链表的首个交点

 

解法1:

使用两个for循环来同时遍历两个数组,来发现首个相同的节点,不过时间复杂度会达到O(M*N)

 

解法2

每个节点添加一个vist访问标志位,来表示已经访问过的节点。首先遍历第一个链表,将访问位置true,然后遍历第二个链表,当发现vist的位true时,则这个节点就是两个链表相交的首个交点。时间复杂度为O(M+N)

 

解法3:

首先求出两个链表的长度c,d;

求出f=abs(c-d);

较长的那个链表首先遍历f个长度,然后两个链表同时开始向下遍历,并进行比较,第一个相等的即为两个链表相交的首个交点。

  • 大小: 1.6 KB
分享到:
评论

相关推荐

    链表----链表构造

    ### 链表构造知识点详解 #### 一、链表基本概念 链表是一种常见的线性...以上是关于单向链表构造的基本知识点及其对应的Java实现代码。这些方法提供了对链表的基本操作能力,可以在此基础上进行更复杂的功能开发。

    笔试题之链表逆序A->B->C to C->B>A

    本题目的核心是“链表逆序”,这是一个常见的编程面试和笔试问题,主要考察程序员对链表操作的理解和实现能力。接下来,我们将详细讨论链表逆序的概念、方法以及如何使用C++进行实现。 链表逆序,顾名思义,就是将...

    C语言双向链表 -------------------------------------------精品

    C语言双向链表 -------------------------------------------精品

    线形表---链表---带头节点单链表的就地逆置

    用c语言描述的线形表---链表---带头节点单链表的就地逆置

    链表---链表大集合

    **合并链表**是链表操作的一个常见问题,通常出现在两个已排序的链表需要合并成一个新的有序链表时。这个问题可以通过迭代或递归的方式解决。迭代方法通常涉及两个指针,分别遍历两个链表,比较节点值并合并;而递归...

    链表排序--选择排序.cpp

    链表排序--选择排序.cpp

    内核链表 -- 学生管理系统

    内核链表是操作系统内核中常用的一种数据结构,它在学生管理系统中可以用来高效地组织和操作学生信息。在本项目中,我们将利用内核链表实现一个简单的学生管理系统,该系统能够创建、更新和读取存储在文件中的学生...

    链表实验-C语言实现

    6. **合并链表**:两个已排序的链表可以合并成一个,保持排序顺序,这是一个常见的链表问题。 7. **反转链表**:将链表的前后顺序颠倒,是链表操作中一个有趣且挑战性的任务。 在C语言中实现这些操作时,需要注意...

    链表创建-输出-删除-示例2.cpp

    链表创建-输出-删除-示例2.cpp

    链表实现-----------多项式乘法

    利用链表的基本操作来实现多项式的乘法 用c语言编写

    数据结构之链表--一元多项式的计算

    在IT领域,数据结构是计算机科学中的核心概念之一,它涉及到如何有效地组织和管理大量数据。链表作为基本的数据结构类型,广泛应用...理解并掌握这些知识对于学习高级算法和数据结构,以及解决实际编程问题都至关重要。

    算法大全-面试题-链表-栈-二叉树-数据结构

    这个"算法大全-面试题-链表-栈-二叉树-数据结构.docx"文档可能包含了这些主题的详细解释、实例解析和练习题,可以帮助学习者巩固基础,提高解决问题的能力。通过深入学习和实践,你可以掌握这些关键的计算机科学概念...

    数据结构-循环链表-C语言实现循环链表功能-数据结构学习

    C语言实现的数据结构中的循环链表 包含源码(.c文件),linux环境下编译生成的可执行文件,头文件 用于C语言以及数据结构的学习,熟练对循环链表边界的判定 实现了以下功能: 创建无头循环链表 向循环链表中插入...

    二叉树-二叉链表结构-构造和输出.cpp

    二叉树-二叉链表结构-构造和输出.cpp

    链表--成绩存储

    说明:字符串的比较和拷贝可以使用标准库函数strcmp和strcpy,使用方法如下: strcmp(name,"#####")!=0 //比较name中存放的字符串是不是"#####" strcpy(ptr->name,name) //将name数组中的字符串复制到ptr指向结点的...

    链表实现--singleList.c

    链表实现同时包括单链表逆序实现、求单链表倒数第N个数、用标尺法找单链表中间节点

    双链表-循环链表-静态链表.pdf

    双链表、循环链表和静态链表是数据结构中的三种不同类型的链式存储结构。它们各自有其特点和适用场景,下面我们将详细介绍这三种链表及其基本操作。 首先,双链表是一种线性数据结构,它的每个节点包含两个指针,...

    哈希表------链表

    哈希表--链表 哈希表--链表 哈希表--链表 哈希表--链表哈希表--链表 哈希表--链表哈希表--链表 哈希表--链表哈希表--链表 哈希表--链表哈希表--链表 哈希表--链表

    c语言-学生成绩管理系统-链表实现-源码.docx

    本系统是一款基于C语言开发的学生信息管理软件,主要通过链表数据结构来实现对学生成绩的增删改查等操作。系统功能包括但不限于:添加学生信息、列出学生信息列表、删除学生信息、成绩排序、成绩统计(如求平均分)...

Global site tag (gtag.js) - Google Analytics