题目:给出一个单链表的,不知道结点N的值,怎样只遍历一次就可以求出中间结点。
我们可以定义两个指针,快指针和慢指针,都从头开始遍历链表,快指针每次走两步,慢指针每次走一步,当快指针走到结尾时,慢指针指向的便是链表的中间节点。
代码如下:
template<class T>
struct ListNode
{
T _value;
ListNode<T>* _next;
ListNode(const T& value)
:_value(value),_next(NULL)
{}
};
template<class T>
class List
{
public:
List()
:_head(NULL)
{}
bool PushBack();
ListNode<T>* FindMidNode()
{
ListNode<T>* fast = _head;
ListNode<T>* slow = _head;
while(fast && fast->_next)
{
slow = slow->_next;
fast = fast->_next->_next;
}
return slow;
}
private:
ListNode<T>* _head;
};