逆置/反轉單鏈表
阿新 • • 發佈:2018-12-10
原理:
首先保留頭指標所指的第一個結點。然後從原連結串列中取出下一個結點插入到第一個結點前。
方法一:三個指標法
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; }