//查找单链表中间元素
#include <iostream>
using namespace std;
struct LinkNode
{
LinkNode *pNext;
int nValue;
LinkNode(int value = 0)
{
nValue = value;
pNext = NULL;
}
};
class Linklist
{
public:
Linklist(){ pHead = new LinkNode(); };
~Linklist(){ delete pHead;};
void InsertValue(int nValue);
void Reverse();
void Reverse2();
LinkNode *FindLastNum(int nNum);
LinkNode *FindMidNode(bool &IsOdd);
void Print();
private:
LinkNode *pHead;
};
void Linklist::InsertValue(int nValue)
{
if (pHead == NULL)
{
return;
}
LinkNode *pCur = pHead;
while (pCur->pNext != NULL)
{
pCur = pCur->pNext;
}
LinkNode *pTmp = new LinkNode(nValue);
pCur->pNext = pTmp;
}
void Linklist::Reverse()
{
if (pHead == NULL)
{
return;
}
//特殊情况:如果链表为空或者只有一个元素,直接返回
if (pHead->pNext == NULL || pHead->pNext->pNext == NULL)
{
return;
}
LinkNode *pPre = pHead;
LinkNode *pCur = pHead->pNext;
LinkNode *pNext;
while (pCur != NULL)
{
pNext = pCur->pNext;
pCur->pNext = pPre;
pPre = pCur;
pCur = pNext;
}
pHead->pNext->pNext = NULL;
pHead->pNext = pPre;
}
void Linklist::Reverse2()
{
if (pHead == NULL)
{
return;
}
//特殊情况:如果链表为空或者只有一个元素,直接返回
if (pHead->pNext == NULL || pHead->pNext->pNext == NULL)
{
return;
}
LinkNode *pCur = pHead->pNext;
LinkNode *pNext = NULL;
LinkNode *pNextNext = NULL;
while (pCur->pNext != NULL)
{
pNext = pCur->pNext;
pNextNext = pNext->pNext;
pNext->pNext = pHead->pNext;
pHead->pNext = pNext;
pCur->pNext = pNextNext;
}
}
LinkNode *Linklist::FindLastNum(int nNum)
{
if (pHead == NULL)
{
return NULL;
}
LinkNode *pFirst = pHead;
int i = 0;
while (i < nNum)
{
if (pFirst == NULL)
{
return NULL;
}
pFirst = pFirst->pNext;
i++;
}
LinkNode *pSecond = pHead;
while (pFirst != NULL)
{
pFirst = pFirst->pNext;
pSecond = pSecond->pNext;
}
return pSecond;
}
//考虑链表个数为奇数Odd、偶数Even两种情况
LinkNode* Linklist::FindMidNode(bool &IsOdd)
{
if (pHead == NULL)
{
return NULL;
}
LinkNode *pFirst = pHead;
LinkNode *pSecond = pHead;
while (pFirst != NULL && pFirst->pNext != NULL)
{
pFirst = pFirst->pNext->pNext;
pSecond = pSecond->pNext;
}
if (pFirst == NULL)
{
IsOdd = true;
}
else
{
IsOdd = false;
}
return pSecond;
}
void Linklist::Print()
{
if (pHead == NULL)
{
return;
}
LinkNode *pCur = pHead->pNext;
while (pCur != NULL)
{
cout<<pCur->nValue<<" ";
pCur = pCur->pNext;
}
cout<<endl;
}
int main()
{
Linklist list;
int nArr[] = {12,13,43,1,2,4,55,23};
for (int i = 0; i < 8; i++)
{
list.InsertValue(nArr[i]);
}
list.Print();
bool IsOdd;
LinkNode *pFind = list.FindMidNode(IsOdd);
if (pFind != NULL)
{
if (IsOdd)
{
cout<<pFind->nValue<<endl;
}
else
{
cout<<pFind->nValue<<" "<<pFind->pNext->nValue<<endl;
}
}
return 0;
}