題目描述
輸入一個鏈表,輸出該鏈表中倒數(shù)第k個結(jié)點(diǎn)。
例如:
輸入鏈表:1->2->3->4->5->6->7籽慢,k = 3
輸出鏈表:5->6->7
題解:
首先獲取鏈表總長度len犯助;然后讓鏈表的頭節(jié)點(diǎn)指針head右移len-k次,就能得到倒數(shù)第k個節(jié)點(diǎn)啦暑脆。
注:記得考慮邊界值k=len渠啤!這種情況,我們要輸出NULL添吗,不然是通過不了滴沥曹!
My Solution(C/C++完整實(shí)現(xiàn)):
#include <cstdio>
#include <iostream>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
int GetLongNode(ListNode *head) {
int len = 0;
while (head) {
head = head->next;
len += 1;
}
return len;
}
class Solution {
public:
ListNode * FindKthToTail(ListNode* pListHead, unsigned int k) {
int len = GetLongNode(pListHead);
int dect_len = len - k;
if (dect_len >= len || dect_len < 0) {
return NULL;
}
while (dect_len) {
pListHead = pListHead->next;
dect_len -= 1;
}
return pListHead;
}
};
int main() {
ListNode a(1);
ListNode b(2);
ListNode c(3);
ListNode d(4);
ListNode e(5);
ListNode f(6);
ListNode g(7);
a.next = &b;
b.next = &c;
c.next = &d;
d.next = &e;
e.next = &f;
f.next = &g;
Solution s;
ListNode *result = s.FindKthToTail(&a, 3);
while (result) {
printf("%d->", result->val);
result = result->next;
}
return 0;
}
結(jié)果:
5->6->7->