// Krzysztof Rudnicki, 307585, task 3 template class Ring{ private: struct Node{ Key key; Node* prev; Node* next; }; Node* any; public: bool removeNeighbours(const Key& givenKey); }; template bool Ring::removeNeighbours(const Key& givenKey) { Node* curr = any; if(any == nullptr || any -> next == nullptr) return 0; // we can't remove 2 nodes if there is less than 2 nodes bool foundKey = 0; // we are interested in 5 nodes, lets call them, from left to right: // A; B; C; D; E // I will use this for comments // if C has a key then at the end we want to get: // A; C; E do{ if(curr -> key == givenKey) { Node* temp = curr; curr -> prev -> prev -> next = curr; // curr -> prev -> prev points to Node "A" // it used to point "next" to Node "B" which we are going to remove so it must // start to point to a new node in our case node "C" curr -> next -> next -> prev = curr; // curr -> next -> next points to Node "E" // it used to point "prev" to Node "D" which we are going to remove so it must // start to point to a new node in our case node "C" curr -> next = curr -> next -> next; // curr points to Node "C" // it used to point "next" to Node "D" which we are going to remove so it must // start to point to a new node in our case node "E" curr -> prev = curr -> prev -> prev; // curr points to Node "C" // it used to point "prev" to Node "B" which we are going to remove so it must // start to point to a new node in our case node "A" if(curr->prev == any || curr -> next == any) any = curr; // if any of the neighours that we are going to delete is "any", we must provide // the ring with a new "any" node delete temp->prev; // this way we will delete what USED to be curr->prev // temp->prev points to "B" node delete temp->next; // this way we will delete what USED to be curr->next // temp->next points to "D" node foundKey = 1; } curr = curr->next; }while(curr != any); return foundKey; }