C语言实现单链表面试题(进阶篇)

摘要:
=见面)//{cur=cur-˃next;Meet=Meet-˃next;}returncur;}可以根据图纸进行分析判断两个链表是否相交。如果它们相交,请找到交点。pNodeCheckCrossNode{pNodecur1=l1;pNodetail=l1;p Noderet=NULL;而{tail=tail-˃next;}tail-˃next=l2;ret=IfRing;returnret;}判断两个链接列表是否相交。如果它们相交,请找到交点。想法:1。首先,你应该判断链表是否有环:没有环,只有一个有环。2.两者都有一个环:入口点在环外,入口点在圈内。

首先给出单链表的结构,下面实现具体代码

typedef int DataType;

typedef struct Node
{
    DataType data;
    struct Node*next;
}Node,*pNode,*pList;//结点

typedef struct ComplexNode
{
    DataType D;
    struct ComplexNode*next;
    struct ComplexNode*random;
}ComplexNode,*pComplexNode;

判断单链表是否带环,若带环,求环的长度,求环的入口点

  1. 判断是否带环
pNode IfRing(pList plist)//判断单链表是否带环,返回交点
{
    pNode slow = plist;
    pNode fast = plist;

    //是否带环
    while (fast&&fast->next)//注意边界问题
    {
        slow = slow->next;
        fast = fast->next->next;
        if (fast == slow)//如果相遇,则带环
        {
            return fast;
        }
    }
    return NULL;
}
  1. 求换的长度
int GetCircleLen(pNode meet)//求环的长度
{

    pNode cur = meet;
    int count = 0;
    do 
    {
        count++;
        cur = cur->next;
    } while (cur!=meet);
    return count;
}
  1. 求环的入口点
pNode GetCircleEntry(pList plist,pNode meet)//求环的入口点
{
    pNode cur = plist;
    pNode fast = plist;
    pNode slow = plist;
    while(cur!=meet)//根据画图可分析出
    {
        cur  = cur->next;
        meet = meet->next;
    }
    return cur;
}

判断两个链表是否相交,若相交,求交点。(假设链表不带环)

pNode CheckCrossNode(pList l1,pList l2)
{
    pNode cur1 = l1;
    pNode tail = l1;
    pNode ret = NULL;
    while(tail->next)
    {
        tail = tail->next;
    }
    tail->next = l2;
    ret = IfRing(l1);
    return ret;
}

判断两个链表是否相交,若相交,求交点。(假设链表可能带环也可能不带环)

思想:
1. 首先应判断链表是否带环:都不带环,只有一个带环
2. 都带环:入口点在环外,入口点在环内。
所有情况如下图所示
这里写图片描述

复杂链表的复制

复杂链表的构建如上面已经给出

ComplexNode CrecteComplexNode(DataType d)//这里创建复杂链表的结点

{
    pComplexNode newNode = (pComplexNode)malloc(sizeof(ComplexNode));
    if (newNode == NULL)
    {
        perror("malloc");
        return NULL;
    }
    newNode->D = d;
    newNode->next = NULL;
    newNode->random = NULL;
    return newNode;

}
void PrintComplexList(pComplexNode head)
{
    pComplexNode cur = head;
    while(cur)
    {
        printf ("%d-->",cur->D);
        printf ("random-->[%d]--->next",cur->random->D);
        cur = cur->next;
    }
    printf ("
");
}

pComplexNode CloneComplexNode(pComplexNode head)//复制复杂链表
{
    pComplexNode cur = head;
    pComplexNode tmp = NULL;
    pComplexNode copy = NULL;
    pComplexNode tail = NULL;
    while(cur)
    {
        pComplexNode newnode = CrecteComplexNode(cur->D);
        tmp = cur;
        cur= cur->next;
        newnode->next = cur;
        tmp->next = newnode;
    }//复制每个节点并插入到节点后
    cur = head;
    while(cur)
    {
        cur->next->random = cur->random->next;
        cur = cur->next->next;
    }//调整random指针
    cur = head;
    copy= cur->next;
    tail = copy;
    while(tail->next)
    {
        tail->next = tail->next->next;
        cur->next = tail->next;
        cur = cur->next;
        tail = tail->next;
        cur->next = NULL;
        return copy;
    }
}

//下面给出具体的测试代码

void test3()
{
    pComplexNode pNode1 = CrecteComplexNode(1);
    pComplexNode pNode2 = CrecteComplexNode(2);
    pComplexNode pNode3 = CrecteComplexNode(3);
    pComplexNode pNode4 = CrecteComplexNode(4);
    pComplexNode pNode5 = CrecteComplexNode(5);


    pNode1->next = pNode2;
    pNode2->next = pNode3;
    pNode3->next = pNode4;

    pNode1->random = pNode4;
    pNode2->random = pNode1;
    pNode3->random = pNode2;
    pNode4->random = pNode2;
    CloneComplexNode(pNode1);
    PrintComplexList(pNode1);

}

这些是c语言实现链表的面试题中较为复杂的了,链表重要的就是逻辑,把主要过程理解清楚。

免责声明:文章转载自《C语言实现单链表面试题(进阶篇)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇git clone远程仓库的分支java.lang.IllegalStateException: Failed to load ApplicationContext 解决办法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

中国石油大学(华东)计算机复试C语言参考题库

目录 复试c语言 【研究创新型】8.1 谁能出线 【设计型】8.2 统计素数的个数 【设计型】8.3 数组逆序输出 【设计型】8.4 在屏幕上显示杨辉三角形 【设计型】8.5 求最大值 【设计型】8.6 二维数组 【设计型】8.11 存储并输出一个矩阵 【设计型】8.7 给数组中的元素按顺序编号 【设计型】8.8 求各位数字组成的最大数 【设计型】8...

机器学习sklearn(四十二):算法实例(十一)分类(五)RandomForestClassifier(二)实例:随机森林在乳腺癌数据上的调参

案例中,往往使用真实数据,为什么我们要使用sklearn自带的数据呢?因为真实数据在随机森林下的调参过程,往往非常缓慢。真实数据量大,维度高,在使用随机森林之前需要一系列的处理,因此不太适合用来做直播中的案例演示。在本章,我为大家准备了kaggle上下载的辨别手写数字的数据,有4W多条记录700多个左右的特征,随机森林在这个辨别手写数字的数据上有非常好的表...

ZH奶酪:【Python】random模块

Python中的random模块用于随机数生成,对几个random模块中的函数进行简单介绍。如下:random.random() 用于生成一个0到1的随机浮点数。如: import random random.random() 输出: 0.3701787746508932 random.uniform(a,b) 用于生成一个指定范围内的随机浮点数,两个参...

Objective-C-基础知识

OC语言前期准备 一、OC简介 Oc语言在c语言的基础上,增加了一层最小的面向对象语法,完全兼容C语言,在OC代码中,可以混用c,甚至是c++代码。 可以使用OC开发mac osx平台和ios平台的应用程序。 拓展名:c语言-.c  OC语言.-m  兼容C++.-mm 注:其实c语言和oc甚至任何一门语言都只是我们为了实现一些功能,达到一些效果而采用的工具...

CenterOS的安装配置(配图解)

CenterOS的安装配置 一、 配置虚拟机 打开Virtual Machine(虚拟机),点击create new virtual machine 进入新建虚拟机向导页面,选择【Custom(advanced)】(自定义),点击【Next】 进入选择虚拟机的硬件兼容性页面,Hardware compatibility选择Worstation...

stm32操作系统ucosiii笔记02

临界段 Critical Sections :  1、为了实现资源共享,一个操作系统必须提供临界段操作的功能   2、uc/os-iii 为了处理林阶段代码需要关中断,处理完毕后需要开中断-——避免其他任务或中断服务进入临界段代码   3、uc/os-iii 定义两个宏(macros)开关中断————OS_ENTER_CRITICAL()         ...