#include <initializer_list> #include <iostream> #include <iterator> #include <utility> /************************************************************/ template<typename T> struct ListNode { ListNode () : data () { } ListNode (const T& v) : data (v) { } ListNode (const T& v, ListNode* n, ListNode* p) : data (v), next (n), prev (p) { } // unhooks the range [begin,end] from a linked list // NOTE: will lose reference to begin and end if you // are not keeping track of it! // // - does not create any new nodes // - does not destroy any existing nodes // - begin is start of range to remove // - end is inclusive end of range to remove // // [5] static void unhook_range (ListNode* begin, ListNode* end) { // TODO } // inserts the range [first,last] before this // NOTE: does not create any new nodes, does not destroy any existing nodes // // [5] void hook_range (ListNode* first, ListNode* last) { // TODO } // insert first before this void hook (ListNode* first) { hook_range (first, first); } // unhooks current node from linked list void unhook () { ListNode::unhook_range (this, this); } T data; ListNode* next{nullptr}; ListNode* prev{nullptr}; }; Please complete the implementation of the missing part marked TODO. // node insertion/removal [5] static Node:: unhook_range (Node* first, Node* last) [3] When first == last (single element) [2] When first != last [5] Node: :hook_range (Node* first, Node* last) [3] When first != last [2] When first == last (single element).