点:边界代码编写能力
题意:一个单链表,获取其倒数第k个节点的值。注意链表最后一个节点是倒数第一个节点。
剑指offer面试题15
思路:两个链表指针初始指向头,第一个先走k步,然后第二个和第一个齐头走,当第一个走到最后一个节点时,第二个所在位置就是倒数第k个节点处。
注意:要考虑链表根本不足k个节点的情况。另外边界代码一定提前画清楚考虑清楚再去写。
代码:
#include <iostream>
template<class T> struct Node {
T val;
Node *next;
Node(T _val):val(_val), next(nullptr) {}
};
template<class T> class Slist {
Node<T> *root;
public:
Slist():root(nullptr) {}
~Slist() {
Node<T> *cur = root;
while (cur) {
Node<T> *next = cur->next;
delete cur;
cur = next;
}
}
void Add (int val) {
if (!root) {
root = new Node<T>(val);
} else {
Node<T> *cur = root;
while (cur) {
if (cur->next) {
cur = cur->next;
} else {
break;
}
}
Node<T> *newnode = new Node<T>(val);
cur->next = newnode;
}
}
void show () {
if (root) {
Node<T> *cur = root;
while (cur) {
std::cout << cur->val << "\t";
cur = cur->next;
}
std::cout << std::endl;
}
}
bool find_reverse_k (int k, T &val) {
Node<T> *cur1 = root, *cur2 = root;
int i = 1;
while (i++ < k) {
if (cur1->next) {
cur1 = cur1->next;
} else if (i < k) {
return false;
}
}
while (cur1) {
if (cur1->next) {
cur1 = cur1->next;
cur2 = cur2->next;
} else {
val = cur2->val;
return true;
}
}
}
};
int main () {
Slist<int> sl;
for (int i = 0; i < 20; i++) {
sl.Add(i);
}
sl.show();
int r_k;
sl.find_reverse_k(5, r_k);
std::cout << r_k << std::endl;
return 0;
}