輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。
**思路如下:兩個指標,先讓第乙個指標和第二個指標都指向頭結點,然後再讓第乙個指正走(k-1)步,到達第k個節點。然後兩個指標同時往後移動,當第乙個結點到達末尾的時候,第二個結點所在位置就是倒數第k個節點了。。
倒數第k個結點,就是正數第n-k個結點。
first先走到第k個結點處,那麼剩下的就是n-k步到末尾。(因為first與last都在第乙個節點,所以只用走k-1步)
此時first與last同時走,first到末尾,那麼last就走到了n-k個結點處了。
/*
public class listnode
}*/public class solution
while(first!=null)
return last;
}}
很中庸的一種做法,如果鍊錶是迴圈鍊錶就不能用這個方法了:
算出總長度,長度比k小,就是空。
倒數第k個,就是正數第n-k處。再走一遍就好。
/*
public class listnode
}*/public class solution
if(k>len)return null;
int step = len-k;
while(step>0)
return head;
}}
還有一種又好理解,又高效的辦法:
用乙個node指向頭結點,乙個結點p依次從頭走到離node相距k個結點處。然後此時開始一起以同樣速度往下走。等p到尾時,node就到了倒數第k個結點了。
程式設計師面試金典 鍊錶
這裡我們可以使用乙個表來記錄訪問過的節點值,這樣只要一次遍歷就可以。但是需要輔助空間。如果不使用臨時緩衝區,該怎麼解決?使用兩個指標,乙個指標指向當前節點,另乙個指標用於向後遍歷剩餘節點,把重複節點刪除。這裡刪除只是用乙個節點就可以,檢查ptr next data是否重複就可以。這裡給出兩種方法 第...
《程式設計師面試金典》回文鍊錶
題目描述 請編寫乙個函式,檢查鍊錶是否為回文。給定乙個鍊錶listnode phead,請返回乙個bool,代表鍊錶是否為回文。測試樣例 返回 true 返回 false 思路我們有兩種方法,比較容易想到的方法應該是使用棧儲存前一半的結點,然後對於後一半的結點再乙個個的與棧內的結點比較是否相等 還有...
鍊錶中倒數第k個結點
題目描述 輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。輸入 輸入可能包含多個測試樣例,輸入以eof結束。對於每個測試案例,輸入的第一行為兩個整數n和k 0 n k 1000 n代表將要輸入的鍊錶元素的個數,k代表要查詢倒數第幾個的元素。輸入的第二行包括n個數t 1 t 1000000 代表鍊錶中的元素...