2.2a Return Kth to Last: Implement an algorithm to find the kth to last element of a singly linked list.
// simulating recursive operation
int kthtolast(Node *head, int k) {
stack<Node*> s;
Node *iter = head;
s.push(iter);
while (iter) {
s.push(iter->next);
iter = iter->next;
}
s.pop(); // remove null
int count = 0;
while (count < k) {
count++;
s.pop();
if (s.empty()) {
return INT_MIN;
}
}
return s.top()->value;
}
int main()
{
LinkedList LL1;
srand(time(nullptr));
int counter = 0;
int random;
while (counter <= 100) {
random = rand() % 1000 + 2;
LL1.insert(random);
counter++;
}
LL1.print();
cout << LL1.kthtolast(LL1.front, 1) << endl;
cout << LL1.kthtolast(LL1.front, 0) << endl;
cout << LL1.kthtolast(LL1.front, 10) << endl;
cout << LL1.kthtolast(LL1.front, 1000) << endl;
pause();
}
// recursively
Node * kthtolast2(Node *head, int k,int &count) {
if (!head) return nullptr;
Node *temp = kthtolast2(head->next, k, count);
++count;
if (count - 1 == k) {
return head;
}
return temp;
}
int kthtolast(Node *head, int k) {
int count = 0;
Node *ret = kthtolast2(head, k, count);
if (!ret) return INT_MIN;
return ret->value;
pause();
}
2.2b Remove jth to Last: Implement an algorithm that removes the jth to last element in a linked list.
The approach I took with this can also be used for 2.2a. The idea is that if you increment one point j amount of times, and have a second point start from the first while iterating both to the end, when the first pointer stops will be when the second pointer is at j.
Node* removejthtolast(Node *front, int j) {
// increment pointer 1 to j
Node *itr = front;
if (!itr || j < 0) return nullptr;
for (int i = 0; i < j; i++) {
itr = itr->next;
if (!itr) return nullptr;
}
Node* itr2 = front;
Node* prev = nullptr;
while (itr->next) {
prev = itr2;
itr2 = itr2->next;
itr = itr->next;
}
prev->next = itr2->next;
delete itr2;
}