1. 程式人生 > >逆置/反轉單鏈表

逆置/反轉單鏈表

原理:

首先保留頭指標所指的第一個結點。然後從原連結串列中取出下一個結點插入到第一個結點

方法一:三個指標法

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;
}