题目:定义一个函数,输入一个链表的头结点,反转该链表并返回反转链表后的头结点。
我们可以借助图来分析一下:
我们定义一个新的头结点为head,将begin指向head->_next,当begin不为空的时候,tmp = begin,begin = begin->_next,此时tmp是我们要摘下来的结点。tmp->_next = head; head = tmp;就完成了结点链接的操作。当循环走完时,_head = head.便完成了链表的逆置。
代码如下:
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();
void Reverse()//单链表的逆置
{
if(_head==NULL||_head->_next==NULL)
return;
ListNode<T>* head = _head;
ListNode<T>* begin = _head->_next;
head->_next = NULL;//置空,不然会死循环
ListNode<T>* tmp = NULL;
while(begin!=NULL)
{
tmp = begin;
begin = begin->_next;
tmp->_next = head;
head = tmp;
}
_head = head;
}
private:
ListNode<T>* _head;
};