`class SLL
{
struct Node {
int key;
Node* next;
};
Node* head;
void reversePrint(Node *curr) const;
bool removeLastOdd(Node *curr);
bool odd(Node *curr) const;
public:
void reversePrint() const;
bool removeLastOdd();
}
Reverse print
void SLL::reversePrint(Node* curr) const;
{
if (!curr)
return;
reversePrint(curr -> next);
cout << curr -> key << ' ';
}
void SLL::reversePrint() const
{
if (head != nullptr)
reversePrint(head);
}
Remove last odd node
// 1st solution
SLL::Node* findLastOdd(Node* curr)
{
if (!curr)
return nullptr;
Node* later = findLastOdd(Node* curr);
if (later)
return later;
if (curr -> key % 2 == 1)
return curr;
return nullptr;
}
bool SSL::removeLastOdd()
{
Node* target = findLastOdd(Node* head)
if (!target)
return 0;
if (target == head)
{
head = head -> next;
delete target;
return 1;
}
Node* curr = head;
while (curr -> next != target)
curr = curr -> next;
curr -> next = target -> next;
delete target;
return 1;
}
bool removeLastOdd(Node* curr, Node* prev)
{
if (!curr)
return 0;
res = removeLastOdd(curr -> next, curr);
if (res)
return res;
// node has not been found yet
if (curr -> key % 2 == 1)
{
if (!prev)
head = curr -> next;
else
prev -> next = curr -> next;
delete curr;
return 1;
}
return 0;
}
bool removeLastNode()
{
return removeLastNode(head, nullptr);
}
The best way
bool removeLastOdd(Node*& curr)
{
if (!curr)
return 0;
if (!curr -> next)
{
delete curr;
curr = nullptr;
return 1;
}
return removeLastNode(curr -> next);
}
Remove last x nodes with given key
bool removeExactLast(int key, int number, int& counter)
{
static int count = 0;
static int key = key;
}