原理:
首先保留头指针所指的第一个结点。然后从原链表中取出下一个结点插入到第一个结点前。
方法一:三个指针法
void ReverseSList(pList* pplist)//三个指针法
{
pNode pPre = NULL, pCur = NULL, pNext = NULL;
assert(pplist);
if (*pplist == NULL || (*pplist)->next == NULL)//排除空链表和一个结点的情况
{
return;
}
//这时链表至少有两个结点
pCur = *pplist;
while (pCur)
{
pNext = pCur->next;
pCur->next = pPre;//该算法的灵魂
pPre = pCur;
pCur = pNext;
}
*pplist = pPre;
}
方法二:头插法
pNode ReverseSListOP(pList plist)//头插
{
pNode pNewHead = NULL;//创建一个空的新链表
pNode p = NULL;//p用来指向原链表中的当前第一个结点
pNode q = NULL;//q用来指向从原链表中取出的每一个结点
if (plist == NULL)//排除空链表情况
{
return;
}
p = plist;//p指向第一个结点
plist = NULL;//头指针与原链表断开
while (p)//当原链表不为空时
{
q = p;//q指向原链表当前第一个结点
p = p->next;
q->next = pNewHead;
pNewHead = q;//将q插入新链表头结点的后面
}
return pNewHead;
}