在單向連結串列中快速查到倒數第n個節點
阿新 • • 發佈:2019-02-05
操作方法和步驟:
(1)定義2個指標p1,p2。
(2)使用迴圈讓p2指向順數第n個節點,同時p1指向第頭結點;
(3)然後,p1和p2同時移動,直到p2指向NULL,此時p1應該指向倒數第n個節點。
iNode * GetLastNnode(iNode * head, int n) { iNode * pfirst=head; // p2 iNode *psecond=head; // p1 int counter; //第1步:建立標尺,移動pfirst N步 for(counter=0; counter<n; counter++) { pfirst = pfirst->next; if(NULL == pfirst) break; // 此時pfirst->next無意義 } if(n != counter) //長度不夠n,未找到倒數第n個節點 return NULL; //第2步:保持距離讓標尺向右移動,直到右端指向末尾,左端即結果 while(pfirst!=NULL) { pfirst=pfirst->next; psecond=psecond->next; } return psecond; }
// 精簡程式,只有一個出口,就一個return iNode * GetLastNnode ( iNode *head, int n) { iNode * pfirst = head; iNode * psecond = NULL;//可能沒有n個 while( n-- > 0 && (pfirst!= NULL) { pfirst = pfirst ->next; } if(pfirst!= NULL)// 有n個節點 psecond = head; while(pfirst!=NULL) { pfirst = pfirst ->next; psecond = psecond ->next; } return psecond; //只有一個出口,無論是否有n個節點,都能返回正確值 }