輸入一個鏈表,輸出該鏈表中倒數(shù)第k個結(jié)點。
容易想到的方法是遍歷一下,計算總共有n個結(jié)點,然后倒數(shù)第k個就可以轉(zhuǎn)化為正數(shù)第n-k+1個結(jié)點。
還可以使用兩個指針,先讓第一個指針走k步,然后兩個指針一起走,當?shù)谝粋€指針為null時,第二個指針所指向的就是倒數(shù)第k個結(jié)點。其實就是讓兩個指針之間相差k步。思路很精巧。
public ListNode FindKthToTail(ListNode head,int k) {
if (head == null) {
return null;
}
ListNode p = head;
ListNode q = head;
while (k-- > 0) {
if (q == null) {
return null;
}
q = q.next;
}
while (q != null) {
q = q.next;
p = p.next;
}
return p;
}
舉一反三
1.求鏈表的中間結(jié)點。
使用一快一慢兩個指針,慢的一次走一步,快的一直走兩步,當快的走到鏈表末尾時,慢的即走到中間位置。
- 判斷一個單項鏈表是否成環(huán)。
使用一快一慢指針,如果快的能追上慢的說明有環(huán),如果快的到了末尾還沒追上慢的說明沒有環(huán)。