昨天看CSDN的一個文章提到,某公司面試時問到單向鏈表的反轉問題,有好多程序員答不出來。以前我也沒做過類似的題目,試着寫了一下。
問題描述:已知一個單向鏈表,寫一個函數,使得該鏈表的方向反轉,即頭變尾,尾變頭,指示方向相反。
分析:該問題可以有兩種方法,一是交換首尾兩個節點的數據,而不改變其內存的存儲結構,二是改變所有節點的指向下一個節點的指針。顯然第二種方法更加有效。
/×鏈表的定義和一些操作*/
typedefstructlist
{
intno;
structlist*pNext;
}list;
list*listinit(intcount)
{
list*pHead;
list*pList;
intno=0;
pHead=malloc(sizeof(list));
pHead->no=no;
pList=pHead;
while(count--)
{
pList->pNext=malloc(sizeof(list));
pList=pList->pNext;
pList->no=++no;
}
pList->pNext=NULL;
returnpHead;
}
voidlistrelease(list*pHead)
{
list*pList=pHead;
list*pNext;
//free((char*)pHead);
//return;
while(pList!=NULL)
{
pNext=pList->pNext;
free(pList);
pList=pNext;
}
}
/*鏈表反轉的算法,其實很簡單*/
list*listreverse(list*pHead)
{
list*pList=pHead;
list*paPre=NULL;
list*paNext=NULL;
do
{
paNext=pList->pNext;
pList->pNext=paPre;
paPre=pList;
pList=paNext;
}while(pList!=NULL);
returnpaPre;
}
/*這是測試用的函數*/
voidlistshow(list*pHead)
{
list*pList=pHead;
while(pList!=NULL)
{
printf("list=%d/n",pList->no);
pList=pList->pNext;
}
}
intmain()
{
list*pHead=listinit(10);
printf("beforereverse:/n");
listshow(pHead);
pHead=listreverse(pHead);
printf("afterreverse:/n");
listshow(pHead);
listrelease(pHead);
return0;
}
運行結果:
beforereverse:
list=0
list=1
list=2
list=3
list=4
list=5
list=6
list=7
list=8
list=9
list=10
afterreverse:
list=10
list=9
list=8
list=7
list=6
list=5
list=4
list=3
list=2
list=1
list=0