面试题答案
一键面试- 迭代器设计:
- 首先定义双向链表节点结构和迭代器类。
template <typename T> struct MyListNode { T data; MyListNode* prev; MyListNode* next; MyListNode(const T& value) : data(value), prev(nullptr), next(nullptr) {} }; template <typename T> class MyListIterator { public: using difference_type = std::ptrdiff_t; using value_type = T; using pointer = T*; using reference = T&; using iterator_category = std::bidirectional_iterator_tag; MyListIterator(MyListNode<T>* node) : current(node) {} reference operator*() const { return current->data; } pointer operator->() const { return &(current->data); } MyListIterator& operator++() { current = current->next; return *this; } MyListIterator operator++(int) { MyListIterator temp = *this; ++(*this); return temp; } MyListIterator& operator--() { current = current->prev; return *this; } MyListIterator operator--(int) { MyListIterator temp = *this; --(*this); return temp; } bool operator==(const MyListIterator& other) const { return current == other.current; } bool operator!=(const MyListIterator& other) const { return!(*this == other); } private: MyListNode<T>* current; };
- 双向链表容器
MyList
实现:- 实现
begin()
和end()
函数。
template <typename T> class MyList { public: MyList() : head(nullptr), tail(nullptr) {} MyListIterator<T> begin() { return MyListIterator<T>(head); } MyListIterator<T> end() { return MyListIterator<T>(nullptr); } void push_back(const T& value) { MyListNode<T>* newNode = new MyListNode<T>(value); if (!tail) { head = tail = newNode; } else { newNode->prev = tail; tail->next = newNode; tail = newNode; } } void pop_back() { if (!tail) return; MyListNode<T>* temp = tail; tail = tail->prev; if (tail) { tail->next = nullptr; } else { head = nullptr; } delete temp; } ~MyList() { while (head) { MyListNode<T>* temp = head; head = head->next; delete temp; } } private: MyListNode<T>* head; MyListNode<T>* tail; };
- 实现
- 边界判断逻辑:
begin()
返回指向链表头节点的迭代器。end()
返回指向nullptr
的迭代器,代表链表尾后位置。- 在插入操作(如
push_back
)时,新节点被正确链接到链表尾部,end()
迭代器依然指向nullptr
,因为end()
代表尾后位置。 - 在删除操作(如
pop_back
)时,当链表为空,head
和tail
都被设置为nullptr
,begin()
返回的迭代器和end()
返回的迭代器相等,符合边界判断逻辑。当链表不为空,删除尾节点后tail
更新,end()
迭代器依然指向nullptr
,保持正确的边界判断。