环形链表与Y型链表
环型链表
之前我们建立的链表都是线性的,一条路走到黑的那种。但是,不排除有时候创建或使用别人的代码时会有环形链表的存在。一旦存在环型链表,那么我们对链表的各个操作就有可能会出现死循环的情况。
检查是否有环型链表
我们创建两个指针,一个指向头结点,一个指向头结点的后一个结点,一前一后往前跑。如果存在环形,那么这两个指针就一定会相遇
bool is_ring(List* list)
{
Node* n1=list->head;
Node* n2=n1>next;
while(NULL ! = n1 && NULL != n2->next)
{
if(n1 == n2) return bool;//追上了,说明有环形链表
n1 =n1->next;
n2 = n2->next;
}
return false;//没追上,说明没有
}
环型链表的入口
如果上述判断结果为真,那么我们可以通过以下函数来判断环形链表的入口在哪里
int* find_ring_in(List* list)
{
if(!is_ring(list))return NULL;//调用上述函数判断是否为环型链表,不是就没这个函数什么事
Node* node = list->head;
while(true)
{
for(Node* i = list->head;i!=node;i =i->next)
{
if(node->next == i)
{
return &i->data;
}
}
node=node->next;
}
}
Y型链表
Y型链表就相当于是两个链表从某个结点开始合成了一个链表。
Y型链表的判断方法
这个相对简单,只要判断两个链表中的某一个结点指向的是不是同一个节点就行
bool is_ylist(List* list1,List* list2)
{
Node* ni=list1->head;
while(NULL != n1) n1=n1->next;
Node* n2=list2->head;
while(NULL != n2) n2=n2->next;
return ni==n2;
}
Y型链表的入口
思想为从两个链表的同一个位置开始往下跑,跑到同一个位置就是Y型链表的入口
int* in_ylist(List* list1,List* list2)
{
if(!is_ylist(list1,list2)) return NULL;
Node *n1= list1->head,*n2=list2->head;
int len1=0,len2=0;
while(NULL !=n1)//判断两个链表的长度
{
n1=ni->next;
len1++;
}
while(NULL != n2)
{
n2=n2->next;
len2++;
}
ni=list1->head,n2=list2->head;//重新置于头结点
if(len1>len2)
{
for(int i = 0;i<len1-len2;i++)
{
n1=n1->next;
}
}
else //这个if else语句是用来将两个链表的指针放到同一个位置
{
for(int i = 0 ; i<lwn2-len1;i++)
{
n2=n2->next;
}
}
while(NULL != n1 && NULL != n2)
{
if(n1= n2)
{
return &n1->data;
}
n1=n1->next;
n2=n2->next;
}
}