#include <stdio.h>
#include <stdlib.h>
typedef struct node{
int value;
struct node *next;
}LinkNode,*Linklist;
/// 创建链表(链表长度,环节点起始位置)
Linklist createList(){
Linklist head = NULL;
LinkNode *preNode = head;
LinkNode *FifthNode = NULL;
for(int i=0;i<6;i++){
LinkNode *tt = (LinkNode*)malloc(sizeof(LinkNode));
tt->value = i;
tt->next = NULL;
if(preNode == NULL){
head = tt;
preNode = head;
}
else{
preNode->next =tt;
preNode = tt;
}
if(i == 3)
FifthNode = tt;
}
preNode->next = FifthNode;
return head;
}
///判断链表是否有环
LinkNode* judgeRing(Linklist list){
LinkNode *fast = list;
LinkNode *slow = list;
if(list == NULL)
return NULL;
while(true){
if(slow->next != NULL && fast->next != NULL && fast->next->next != NULL){
slow = slow->next;
fast = fast->next->next;
}
else
return NULL;
if(fast == slow)
return fast;
}
}
///获取链表环长
int getRingLength(LinkNode *meetNode){
int RingLength=0;
LinkNode *fast = meetNode;
LinkNode *slow = meetNode;
for(;;){
fast = fast->next->next;
slow = slow->next;
RingLength++;
if(fast == slow)
break;
}
return RingLength;
}
///获取链表头到环连接点的长度
int getLenA(Linklist list,LinkNode *meetNode){
int lenA=0;
LinkNode *fast = list;
LinkNode *slow = meetNode;
for(;;){
fast = fast->next;
slow = slow->next;
lenA++;
if(fast == slow)
break;
}
return lenA;
}
///释放空间
int freeMalloc(Linklist list){
LinkNode *nextnode = NULL;
while(list != NULL){
nextnode = list->next;
free(list);
list = nextnode;
}
}
int main(){
Linklist list = NULL;
LinkNode *meetNode = NULL;
int RingLength = 0;
int LenA = 0;
list = createList();
meetNode = judgeRing(list);
if(meetNode == NULL)
printf("No Ring\n");
else{
printf("Have Ring\n");
RingLength = getRingLength(meetNode);
LenA = getLenA(list,meetNode);
printf("RingLength:%d\n",RingLength);
printf("LenA:%d\n",LenA);
printf("listLength=%d\n",RingLength+LenA);
freeMalloc(list);
}
return 0;
}
求有环单链表的链表长
最新推荐文章于 2021-12-27 17:58:57 发布