求单链表交点算法:
先求得两条链表各自的长度,如果最后一个节点的地址相同,则确定链表有交点。然后求出长度差值k,让长的链表指针先走k步,然后两个链表指针同时走,边走边比较,第一次相等处即是交点。
代码:
struct Node
{
int data;
struct Node * next;
};
Node* FixIntersetion(Node* pHead1, Node* pHead2)
{
Node* p1 = pHead1;
Node* p2 = pHead2;
int i = 1, j = 1, k = 0, diff = 0;
//如果都是空链表,肯定没有交点
if(pHead2 == NULL || pHead2 == NULL)
{
return NULL;
}
//获取链表长度
while(p1->next != NULL)
{
p1 = p1->next;
i++;
}
while(p2->next != NULL)
{
p2 = p2->next;
j++;
}
//开始判断是否存在交点
if(p1 != p2)
{//根据有交点时,两个链表在交点及其之后的部分是公共的,因此,有交点的单链表的尾节点必定相同
return NULL; //如果尾节点不同,直接返回NULL
}
else //否则寻找第一个相同的节点
{
p1=pHead1;
p2=pHead2;
//使得两者的起始比较位置离尾部的长度一致
if(i>j)
{
diff=i-j;
for(k=0; k<diff; k++)
{
p1 = p1->next;
}
}
if(i<j)
{
diff=j-i;
for(k=0; k<diff; k++)
{
p2 = p2->next;
}
}
//开始比对,得出交点
while(p1 != p2)
{
p1 = p1->next;
p2 = p2->next;
}
return p1;
}
}
判断链表是否有环算法:
两个指针一快一慢,快指针一次走两步,慢指针一次走一步,如果快指针首先走到头则无环。如果快慢指针会相等,则有环。
代码
bool FixRing(Node * pHead)
{
Node * pSlow = pHead ;
Node * pFast = pHead;
while ( pFast && pFast -> next ) //如果存在环,不存在p-next=NULL的情况
{
pSlow = pSlow -> next;//前进一步
pFast = pFast -> next -> next;//前进两步
if ( pSlow == pFast )
break ;
}
return ! (pFast == NULL || pFast -> next == NULL);
}