链表是常有的数据结构,也是笔试、面试常客
如何判断一个链表是否有环;若有环,则环的第一个交点;找链表的倒数第k个节点;都是快慢指针的应用;下面给出这三个的实现方法
(1)如何判断一个链表是否有环
bool IsListR(LinkList* head)
{
LinkList*pS = head; //慢指针
LinkList*pF = head; //快指针
while (pF != NULL && pF->next != NULL)
{
pS = pS->next;
pF = pF->next->next;
if (pS == pF) //如果有环,快指针必定追上慢指针
return true;
}
return false;
}
(2)若有环,则环的第一个交点
LinkList* IsListR(LinkList* head)
{
LinkList*pS = head;
LinkList*pF = head;
while (pF != NULL && pF->next != NULL)
{
pS = pS->next;
pF = pF->next->next;
if (pS == pF)
break;
}
if (pF == NULL && pF->next == NULL)
return NULL;
pS = head;
while (pS != pF)
{
pS = pS->next;
pF = pF->next;
}
return pS;
}
找链表的倒数第k个节点
LinkList* IsListTailK(LinkList* head,int k)
{
LinkList*pS = head;
LinkList*pF = head;
for (int i = 1; i < k; i++) //快指针先走k-1步
{
if (pF == NULL)
return NULL;
pF = pF->next;
}
while (pF != NULL )
{
if (pF == NULL)
return pS;
pS = pS->next;
pF = pF->next;
}
return NULL;
}
思路:
1、从头遍历两个链表,记录两链表长度
2、若两链表尾部相等,则说明两链表肯定相交
3、长链表先行 两长度差 的步数
4、然后再一起遍历,如果相等,就返回了交点之处