鏈表是常有的數據結構,也是筆試、面試常客
如何判斷一個鏈表是否有環;若有環,則環的第一個交點;找鏈表的倒數第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、然後再一起遍歷,如果相等,就返回了交點之處