求有环单链表中的环长、环起点、链表长
来源:互联网 发布:淘宝店铺店招类型 编辑:程序博客网 时间:2024/09/21 08:57
1.判断单链表是否有环
使用两个slow, fast指针从头开始扫描链表。指针slow 每次走1步,指针fast每次走2步。如果存在环,则指针slow、fast会相遇;如果不存在环,指针fast遇到NULL退出。
就是所谓的追击相遇问题:
2.求有环单链表的环长
在环上相遇后,记录第一次相遇点为Pos,之后指针slow继续每次走1步,fast每次走2步。在下次相遇的时候fast比slow正好又多走了一圈,也就是多走的距离等于环长。
设从第一次相遇到第二次相遇,设slow走了len步,则fast走了2*len步,相遇时多走了一圈:
环长=2*len-len。
3.求有环单链表的环连接点位置
第一次碰撞点Pos到连接点Join的距离=头指针到连接点Join的距离,因此,分别从第一次碰撞点Pos、头指针head开始走,相遇的那个点就是连接点。
在环上相遇后,记录第一次相遇点为Pos,连接点为Join,假设头结点到连接点的长度为LenA,连接点到第一次相遇点的长度为x,环长为R。
第一次相遇时,slow走的长度 S = LenA + x;
第一次相遇时,fast走的长度 2S = LenA + n*R + x;
所以可以知道,LenA + x = n*R; LenA = n*R -x;
4.求有环单链表的链表长
上述2中求出了环的长度;3中求出了连接点的位置,就可以求出头结点到连接点的长度。两者相加就是链表的长度。
编程实现:
下面是代码中的例子:
代码:
#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;}
原文博客:http://www.cnblogs.com/xudong-bupt/p/3667729.html
- 求有环单链表中的环长、环起点、链表长
- 求有环单链表中的环长、环起点、链表长
- 求有环单链表中的环长、环起点、链表长
- 求有环单链表中的环长、环起点、链表长
- 求有环单链表中的环长、环起点、链表长
- 求有环单链表中的环长、环起点、链表长
- 求有环单链表中的环长、环起点、链表长
- 求有环单链表中的环长、环起点、链表长
- 求有环单链表中的环长、环起点、链表长
- 求有环单链表中的环长、环起点、链表长
- 求有环单链表中的环长、环起点、链表长
- 求有环单链表中的环长、环起点、链表长
- 求有环单链表中的环长、环起点、链表长
- 求有环单链表中的环长、环起点、链表长
- 【推导】求有环单链表中的环长、环起点、链表长
- 【启发】求有环单链表中的环长、环起点、链表长【快 、 慢指针】
- 单链表是否有环,求环起点,环长等
- 有环链表问题-确定有环链表的环起点,环长及柄长
- 黑马程序员-一个菜鸟到大神
- weka介绍与安装
- [LeetCode] LRU Cache
- 开始了,开始了,因为一些原因,开始复习算法以及总结一下工作,很好
- 网络基本功(一):细说网络传输
- 求有环单链表中的环长、环起点、链表长
- 由IIS换到apache,始终报错,80端口被占用 解决方法
- 黑马程序员 【】java学习之路——内部类和匿名内部类简介
- 如何在CentOS6上安装Python2.7和Python3.3
- Python自省的威力
- UIScrollView委托<UIScrollViewDelegate>
- UVA - 839 Not so Mobile
- 网络基本功(二):细说交换机
- UVA - 11076 Add Again (重复元素的排列)