肥猫学习日记------关于链表的扩展(一)

环形链表与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;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值