程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 鏈表逆置

鏈表逆置

編輯:C++入門知識

好些時間沒有搞數據結構了,昨天下午老師讓我麼寫個單鏈表的逆置,當時做了幾到都沒有測試過;晚上耍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就起到了一系列的中轉作用;

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved