好些時間沒有搞數據結構了,昨天下午老師讓我麼寫個單鏈表的逆置,當時做了幾到都沒有測試過;晚上耍CF去了……今天上午又做了一到過了,
這次感覺比較有意義,對內存上的分配更加清新了;上課沒聽老師講好像記得他用的兩個指針,我寫的時候用了四個指針,
我做的時候在桌面畫了一個圖,看著這個圖寫出來的;
主要說下算法:
[cpp]
void Reverse(List Head)
{
List pTwo,pMid,JIE,Haha; //JIE Haha用於中轉用的
pTwo=Head->pNext; //pTwo指向頭結點的下一個節點
pMid=pTwo->pNext; //指向pTwo下一個節點
pTwo->pNext=NULL;
while(pMid!=NULL)
{
Haha=pMid;
JIE=pMid->pNext;
pMid->pNext=pTwo;
Head->pNext=pMid;
pTwo=Haha;
pMid=JIE;
}
}
void Reverse(List Head)
{
List pTwo,pMid,JIE,Haha; //JIE Haha用於中轉用的
pTwo=Head->pNext; //pTwo指向頭結點的下一個節點
pMid=pTwo->pNext; //指向pTwo下一個節點
pTwo->pNext=NULL;
while(pMid!=NULL)
{
Haha=pMid;
JIE=pMid->pNext;
pMid->pNext=pTwo;
Head->pNext=pMid;
pTwo=Haha;
pMid=JIE;
}
}
說這個算法之前要先搞清楚一個地方:之前生成的節點的內存地址是固定不變的,我們只是改變了這個節點中的數據(指針域),使其在遍歷時順序變一下而已,而其本身的地址沒變,
算法思路是這樣的:把第二個節點(pTwo下一個節點)插到Head節點的後一個位置——>把第三個節點插到Head節點的後一個位置——>第四個...知道插完;
再解釋一下上面代碼的實現過程:
將pMid指向的節點的指針域指向pTwo,把Head的指針域指向pMid這樣就完成了一個元素的插入,
下面就很接著我們要把此時的pMid賦值給pTwo(賦值的是本身地址而不是數據(指針域));
這裡的pMid應該往下面繼續走,但是前面:將pMid指向的節點的指針域指向pTwo,這裡就造成了走不動的現象了;
所以要用一個中轉指針來儲存原先pMid的地址,所以中轉指針Haha JIE就起到了一系列的中轉作用;