通過一次遍歷找到單鏈表中倒數第n個節點,鍊錶可能相當大,可使用輔助空間,但是輔助空間的數目必須固定,不能和n有關。
單向鍊錶的特點是遍歷到末尾後不能反向重數n個節點。因此必須在到達尾部的同時找到倒數第n個節點。
不管是順數n個還是倒數n個,其實都是距離-標尺問題。標尺是一段距離可以用線段的兩個端點來衡量,我們能夠判斷倒數第乙個節點,因為他的next==null。如果我們用兩個指標,並保持他們的距離為n,那麼當這個線段的右端指向末尾節點時,左端節點就指向倒數第n個節點。
inode * getlastnnode(inode * head, int n)
if(n != counter) //長度不夠n,未找到倒數第n個節點
return null;
//第2步:保持距離讓標尺向右移動,直到右端指向末尾,左端即結果
while(pfirst!=null)
return psecond;}
inode * getlastnnode ( inode *head, int n)
if(pfirst!= null)// 有n個節點
psecond = head;
while(pfirst!=null)
return psecond; //只有乙個出口,無論是否有n個節點,都能返回正確值
}
和上面的思路類似,設定2個指標,乙個走2步時,另乙個走1步。那麼乙個走到頭時,另乙個走到中間。一次遍歷單向鍊錶找到中間節點
view source
print?
inode * getmiddlenode ( inode *head )
}return p1;
}
#include #include#includeusing namespace std;
struct node
;node *createlinklist()
return head;
}void printlinklist(node *head)
}node *getlastnode(node *head,int n)
while(first!=null)
return second;
}node *getmiddlenode(node *head)
}return p2;
}int main()
刪除單鏈表倒數第n個節點
如何刪除單鏈表中的倒數第n個節點?先遍歷一遍單鏈表,計算出單鏈表的長度,然後,從單鏈表頭部刪除指定的節點。description 刪除單鏈表倒數第n個節點,常規解法.param head param n return listnode public static listnode removenth...
查詢單鏈表中倒數第k個節點
那麼,這次來說乙個具體的問題吧,乙個單向鍊錶中有n個結點,現在要求列印鍊錶中的倒數第k個結點,應該怎樣實現?普通人反映出的第乙個思路應該是先遍歷一遍整個鍊錶知道鍊錶的長度len,然後要輸出倒數第k個就是正數的第len k 1個結點,那麼只需要遍歷鍊錶到這個結點然後列印就好了。顯然這個方法需要遍歷2次...
單鏈表查詢倒數第K個節點
分析 p q兩個指標指向表頭結點,p向前移動k個位置後q向前移動,當p結點移到尾結點時,q的next指標域所指結點即為所求結點 若不存在k個結點,則當p指向尾結點時,k不為0。include include typedef struct node node,linklist linklist cre...