帶頭結點的單鏈表實現就地逆置的更優方法
阿新 • • 發佈:2019-02-13
在習慣上,我們在實現連結串列的逆置時都會採用從第一個結點開始遍歷並不斷將連結串列的指向逆置的方法,但這樣做效率其實不高。假設要逆置的連結串列為L,更好的方法是先用指標p儲存L-〉next,再將連結串列L的頭結點置為Null,亦即L-〉next=Null,而後將p所指向的原存在於L的各個結點插入在已經置空的L中,作為L的第一個元素結點,p則每次下移用於記錄剩下結點的位置。具體程式碼如下:
p=L->next;
L->next=NULL;
while(p&&p->next)//該迴圈的限制條件意在說明空表和只含一個元素結點的空表不用參加逆置
{
s=p->next;//指標s防止可以結點地址丟失
p->next=L->next;
L->next=p;
p=s;
}
注:我一開始的程式碼是這樣的
firstNode=p=L->next;
L->next=NULL;
while(p&&p->next)//該迴圈的限制條件意在說明空表和只含一個元素結點的空表不用參加逆置
{if(p!=firstNode){
s=p->next;//指標s防止可以結點地址丟失
p->next=L->next;
L->next=p;
p=s;
}//end if
else{
s=p->next;
p->next=NULL;//其實該式與p->next=L->next;結果是一樣的,判斷語句完全不必要
L->next=p;
p=s;
}//end else
}
不難發現,進行條件判斷其實是多餘的,以後更要注意這種情況,以提高程式碼簡潔性