單鏈表的環操做

鏈表介紹:ide

鏈表概念--鏈表是一種線性表,可是並非順序存儲,而是每一個節點裏面存儲着下一個節點的指針,把存儲數據元素的數據串鏈起來。url

spacer.gif單鏈表演示圖:wKiom1cDfaLi5qfZAAAcmhIIxsU523.pngspa


建立結構體指針

typedef int DataType;blog

typedef struct ListNodeget

{it

DataType data;io

struct ListNode *pNext;class

}SListNode, *PSListNode;List



求環入口點:


spacer.gifspacer.gifwKioL1cDgy_gl7qDAAAud4L0XGI739.png


PSListNode FindEnterNode(PSListNode pHead, PSListNode pMeetNode)

{

PSListNode pNode1 = pHead;

PSListNode pNodeM = pMeetNode;

if (pHead == NULL || pMeetNode == NULL)

{

return NULL;

}

while (pNode1 != pNodeM)

{

pNode1 = pNode1->pNext;

pNodeM = pNodeM->pNext;

}

return pNode1;

}


判斷兩個鏈表


是否相交:


wKioL1cDhZqS6jhpAAAj_qT5Org803.png


int IsListCroseWithCycle(PSListNode pL1, PSListNode pL2)

{

PSListNode pL1MeetNode = NULL;

PSListNode pL2MeetNode = NULL;

PSListNode pL1Node = pL1;

PSListNode pL2Node = pL2;

PSListNode pNode = NULL;

if (pL1 == NULL || pL2 == NULL)

{

return 0;

}

pL1MeetNode = HasCycle(pL1Node);

pL2MeetNode = HasCycle(pL2Node);


//都不帶環

if (pL1MeetNode == NULL && pL2MeetNode == NULL)

{

while (pL1Node->pNext != NULL)

{

pL1Node = pL1Node->pNext;

}

while (pL2Node->pNext != NULL)

{

pL2Node = pL2Node->pNext;

}

if (pL1Node == pL2Node)

{

return 1;

}

return 0;

}


//兩個都帶環

if (pL1MeetNode != NULL && pL2MeetNode != NULL)

pNode = pL1MeetNode;

{

while (pNode->pNext != pL1MeetNode)

{

if (pL2MeetNode == pNode)

{

return 1;

}

pNode = pNode->pNext;

}

return 0;

}

}

相關文章
相關標籤/搜索