思路和求链表中倒数第K个结点的思路类似,采用双指针,一个走一步,一个走两步,需要注意代码的鲁棒性。(感觉算法处理边界条件花了很多时间)
代码和测试用例如下:
#include <iostream>
#include <cstdlib>
using namespace std;
struct ListNode
{
int m_nValue;
ListNode *m_pNext;
};
//创建链表
ListNode *CreateListNode(int value)
{
ListNode *pNode = new ListNode();
pNode->m_nValue = value;
pNode->m_pNext = NULL;
return pNode;
}
//连接结点
void ConnectListNodes(ListNode *pCurrent, ListNode *pNext)
{
if (pCurrent == NULL)
{
cout << "Error to connect two nodes" << endl;
exit(1);
}
pCurrent->m_pNext = pNext;
}
//打印
void PrintListNode(ListNode *pNode)
{
if (pNode == NULL)
{
cout << "The node is NULL" << endl;
}
else
{
printf("The key in node is %d.\n", pNode->m_nValue);
}
}
//销毁
void DestroyList(ListNode *pHead)
{
ListNode *pNode = pHead;
while (pNode != NULL)
{
pHead = pHead->m_pNext;
delete pNode;
pNode = pHead;
}
}
//特别需要注意代码的鲁棒性
ListNode *FindMiddleNode(ListNode *pListHead)
{
if (pListHead == NULL)
{
return NULL;
}
ListNode *pAHead = pListHead;
ListNode *pBehind = pListHead;
while (pAHead->m_pNext != NULL && pBehind != NULL)
{
pBehind = pBehind->m_pNext;
pAHead = pAHead->m_pNext->m_pNext;
}
return pBehind;
}
// ====================测试代码====================
void Test1()
{
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 Test2()
{
printf("=====Test2 starts:=====\n");
ListNode* pNode1 = CreateListNode(1);
ListNode* pNode2 = CreateListNode(2);
ListNode* pNode3 = CreateListNode(3);
ListNode* pNode4 = CreateListNode(4);
ListNode* pNode5 = CreateListNode(5);
ListNode* pNode6 = CreateListNode(6);
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 Test3()
{
printf("=====Test4 starts:=====\n");
printf("expected result: NULL.\n");
ListNode* pNode = FindMiddleNode(NULL);
PrintListNode(pNode);
}
void main()
{
Test1();
Test2();
Test3();
system("pause");
}