C语言链表在笔试面试中常考问题总结_第1页
C语言链表在笔试面试中常考问题总结_第2页
C语言链表在笔试面试中常考问题总结_第3页
C语言链表在笔试面试中常考问题总结_第4页
C语言链表在笔试面试中常考问题总结_第5页
已阅读5页,还剩1页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实现单链表逆置无头结点:1#include<stdio.h>2#include<stdlib.h>34typedefstructnode{5intdata;6structnode*next;7}Node;89//创建链表10Node*CreateList(void){11intval,i,n;12Node*head,*p,*q;1314head=NULL;15printf("请输入您要建立的链表长度:\n");16scanf("%d",&n);17printf("请输入您要输入的数据:\n");18for(i=0;i<n;i++){19scanf("%d",&val);20p=(Node*)malloc(sizeof(Node));21p->data=val;22if(head==NULL)23head=q=p;24else25q->next=p;26q=p;27}28p->next=NULL;29returnhead;30}3132//链表的逆置33Node*ReverseList(Node*head){34Node*p,*q,*r;35p=head;36q=r=NULL;37while(p){38q=p->next;39p->next=r;40r=p;41p=q;42}43returnr;44}4546//输出链表47voidShowList(Node*head){48Node*p;49p=head;50while(p){51printf("%d",p->data);52p=p->next;53}54printf("\n");55}5657voidmain(){58Node*head;5960head=CreateList();61printf("链表逆置前的数据:\n");62ShowList(head);6364head=ReverseList(head);65printf("链表逆置后的数据:\n");66ShowList(head);67}运行演示:2、判断单链表是否有环判断链表是否存在环的办法为:设置两个指针(fast,slow),初始值都指向头指针,slow每次前进一步,fast每次前进两步,如果链表存在环,则fast必定先进入环,而slow后进入环,两个指针必定相遇。(当然,fast先行从头到尾部为NULL,则为无环链表)程序如下:1#include<stdio.h>2#include<stdlib.h>34typedefstructnode{5intelem;6structnode*next;7}Node,*NodeList;89boolIsExitsLoop(NodeListhead){10NodeListslow=head,fast=head;11while(fast&&fast->next){12slow=slow->next;13fast=fast->next->next;14if(slow==fast)15break;16}17return!(fast==NULL||fast->next==NULL);18}1920voidmain(){21//创建一个有环的单链表22NodeListhead=NULL,p,q;23for(inti=1;i<=5;i++){24p=(NodeList)malloc(sizeof(Node));25p->elem=i;26if(head==NULL)27head=q=p;28else29q->next=p;30q=p;31}32p=(NodeList)malloc(sizeof(Node));33p->elem=6;34q->next=p;35q=p;36q->next=head->next->next->next;37//判断单链表是否存在环38printf("单链表是否存在环:");39boolb=IsExitsLoop(head);40printf("%s\n",b==false?"false":"true");41}运行结果显示:3、如果单链表有环,则找到环的入口点当fast若与slow相遇时,slow肯定没有遍历完链表,而fast已经在环内循环了n圈(1<=n),假设slow走了s步,而fast走了2s步(fast步数还等于s加上在环上多转的n圈),设环长为r,则:2s=s+n*r;s=n*r;设整个链表长为L,入口环与相遇点距离为x,起点到环入口点的距离为a。a+x=n*r;a+x=(n-1)*r+r=(n-1)*r+L-a;a=(n-1)r+(L–a–x);(L–a–x)为相遇点到环入口点的距离,由此可知,从链表头到环入口点等于(n-1)循环内环+相遇点到环入口点,于是我们从链表头、与相遇点分别设一个指针,每次各走一步,两个指针必定相遇,且相遇第一点为环入口点。程序描述如下:1#include<stdio.h>2#include<stdlib.h>34typedefstructnode{5intelem;6structnode*next;7}Node,*NodeList;89//寻找环的入口点10NodeListFindLoopPort(NodeListhead){11NodeListslow=head,fast=head;12while(fast&&fast->next){13slow=slow->next;14fast=fast->next->next;15if(slow==fast)16break;17}18if(fast==NULL||fast->next==NULL)19returnNULL;20slow=head;21while(slow!=fast){22slow=slow->next;23fast=fast->next;24}25returnslow;26}2728voidmain(){29//创建一个有环的单链表30NodeListhead=NULL,p,q;31for(inti=1;i<=5;i++){32p=(NodeList)malloc(sizeof(Node));33p->elem=i;34if(head==NULL)35head=q=p;36else37q->next=p;38q=p;39}40p=(NodeList)malloc(sizeof(Node));41p->elem=6;42q->next=p;43q=p;44q->next=head->next->next->next;45//寻找环的入口点46NodeListlist=FindLoopPort(head);47printf("环的入口节点元素值为:%d\n",list->elem);48}运行结果显示:4、判断两个单链表是否相交,如果相交,给出相交的第一个点(两个链表都不存在环)比较好的方法有两个:一、将其中一个链表首尾相连,检测另外一个链表是否存在环,如果存在,则两个链表

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论