方法一:三指针法
首先,上代码
void pListReversal1(pList *pHead)//反转单链表1:三指针法
{
assert(pHead);
pList pFast = *pHead;
pList pMiddle = *pHead;
pList pSlow = NULL;
while (pFast)
{
pFast = pFast->_pNext;
pMiddle->_pNext = pSlow;
pSlow = pMiddle;
pMiddle = pFast;
}
*pHead = pSlow;
}
图解:
初始,(pSlow定义为NULL)
让pFast 往前走一步(pFast = pFast->_pNext;)
然后让pMiddle指向pSlow这样就把第一个节点逆置结束了
把三个指针统一往前移一位,再重复上上述过程;
这样就完成了第二个节点的逆置
这样多循环几次就完全逆置啦。
方法二:头插法逆置
首先上代码:
void pListReversal3(pList *pHead)//反转单链表2:头插法(创建新链表)
{
assert(pHead);
pList pNewNode = pBuyNewNode(0);
pList pCur;
while (*pHead)
{
pCur = (*pHead)->_pNext;
(*pHead)->_pNext = pNewNode->_pNext;
pNewNode->_pNext = *pHead;
(*pHead) = pCur;
}
*pHead = pNewNode->_pNext;
free(pNewNode);
}
该方法需要新建立一个节点,然后进行头插。(最后可将新建立的节点删除)此链接为有头单链表的头插法逆置,相比无头只是不用创建新节点;所以可以直接参考