逆置/反轉單鏈表(C語言)
阿新 • • 發佈:2019-02-14
1、逆置連結串列:前插法
void ReverseList(PSListNode* pHead)
{
if (NULL == *pHead)
{
return;
}
else
{
//建立一個新的空連結串列,遍歷pHead指向的連結串列裡的所有節點,每找到一個,就前插到新連結串列裡
PSListNode pNewHead = *pHead;
*pHead = (*pHead)->pNextNode;
//第一次前插到新連結串列裡的結點,是新連結串列的尾節點,所以要使它的下一個結點為空
pNewHead-> pNextNode = NULL;
while (NULL != *pHead)
{
PSListNode pNode = *pHead;
*pHead = (*pHead)->pNextNode;
pNode->pNextNode = pNewHead;
pNewHead = pNode;
}
*pHead = pNewHead;
}
}
2、逆置連結串列:三指標法
void ReverseList(PSListNode* pHead)
{
assert(pHead);
if ((*pHead == NULL) || ((*pHead)->pNextNode) == NULL)
{
return;
}
else
{
PSListNode pPreNode = *pHead;
PSListNode pCurNode = (*pHead)->pNextNode;
PSListNode pOffNode = (*pHead)->pNextNode->pNextNode;
PSListNode pNode = NULL;
while (1)
{
pCurNode->pNextNode = pPreNode;
pPreNode->pNextNode = pNode;
pNode = pPreNode;
if (pOffNode == NULL)
{
break;
}
else
{
pPreNode = pCurNode;
pCurNode = pOffNode;
pOffNode = pOffNode->pNextNode;
}
}
*pHead = pCurNode;
}
}