// 求链表的中间结点
//思路:定义两个指针,第一个指针每次走两步,第二个指针每次走一步
//当走的快的指针走到链表的末尾时,走得慢的指针正好在链表的中间
ListNode* FindMiddleNode(ListNode* pListHead)
{if(pListHead==NULL)
return NULL;
ListNode* pFirst=pListHead;
ListNode* pSecond=pListHead;
while (pSecond->m_pNext!=NULL)
{
pSecond=pSecond->m_pNext;
if(pSecond->m_pNext==NULL)
break;
pSecond=pSecond->m_pNext;
pFirst=pFirst->m_pNext;
}
return pFirst;
}
//************测试相关题目****************
// 奇数链表
void TestForRelative1()
{
printf("=====Test1 starts:=====\n");
ListNode* pNode1 = CreateListNode(1);
ListNode* pNode2 = CreateListNode(2);
ListNode* pNode3 = CreateListNode(3);
ListNode* pNode4 = CreateListNode(4);
ListNode* pNode5 = CreateListNode(5);
ConnectListNodes(pNode1, pNode2);
ConnectListNodes(pNode2, pNode3);
ConnectListNodes(pNode3, pNode4);
ConnectListNodes(pNode4, pNode5);
//求中间结点
printf("expected result: 3.\n");
ListNode* pNode = FindMiddleNode(pNode1);
PrintListNode(pNode);
DestroyList(pNode1);
}
// 偶数结点
void TestForRelative2()
{
printf("=====Test1 starts:=====\n");
ListNode* pNode1 = CreateListNode(1);
ListNode* pNode2 = CreateListNode(2);
ListNode* pNode3 = CreateListNode(3);
ListNode* pNode4 = CreateListNode(4);
ConnectListNodes(pNode1, pNode2);
ConnectListNodes(pNode2, pNode3);
ConnectListNodes(pNode3, pNode4);
//求中间结点
printf("expected result: 2.\n");
ListNode* pNode = FindMiddleNode(pNode1);
PrintListNode(pNode);
DestroyList(pNode1);
}
// 只有一个结点
void TestForRelative3()
{
printf("=====Test1 starts:=====\n");
ListNode* pNode1 = CreateListNode(1);
//求中间结点
printf("expected result: 1.\n");
ListNode* pNode = FindMiddleNode(pNode1);
PrintListNode(pNode);
DestroyList(pNode1);
}
// 只有两个结点
void TestForRelative4()
{
printf("=====Test1 starts:=====\n");
ListNode* pNode1 = CreateListNode(1);
ListNode* pNode2 = CreateListNode(2);
ConnectListNodes(pNode1, pNode2);
//求中间结点
printf("expected result: 1.\n");
ListNode* pNode = FindMiddleNode(pNode1);
PrintListNode(pNode);
DestroyList(pNode1);
}
// 空指针
void TestForRelative5()
{
printf("=====Test1 starts:=====\n");
ListNode* pNode1 = NULL;
//求中间结点
printf("expected result: NULL.\n");
ListNode* pNode = FindMiddleNode(pNode1);
PrintListNode(pNode);
DestroyList(pNode1);
}