1. 程式人生 > >在單向連結串列中快速查到倒數第n個節點

在單向連結串列中快速查到倒數第n個節點

操作方法和步驟:

(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個節點,都能返回正確值 
}