非递归实现:思路为将节点从前到后依次放到表头,最后最后的节点到了最前面,最前面的节点到了最后面
ListNode * ReverseList(ListNode * head)
{
//如果链表为空或者链表中只有一个元素
if(head==NULL || head->m_pNext==NULL)
return head;
ListNode * p=head->m_pNext;
ListNode * q=head;
while(p!=NULL)
{
q->m_pNext=p->m_pNext;//记录下p的下一个节点
p->m_pNext=head;
head=p;
p=q->m_pNext;//准备将p的下一个节点放到表头
}
return head;
}
递归实现:
ListNode * ReverseList2(ListNode * head)
{
//如果链表为空或者链表中只有一个元素
if(head==NULL || head->m_pNext==NULL)
return head;
else
{
ListNode * newhead=ReverseList2(head->m_pNext);//先反转后面的链表
head->m_pNext->m_pNext=head;//再将当前节点设置为其然来后面节点的后续节点
head->m_pNext=NULL;
}
return newhead;
}
链表:1->2->3->4->NULL
注意一点:当head=4时,直接执行 return head,不会执行下面的代码。return head执行后,下一个执行的代码是ListNode * newhead=ReverseList2(head->m_pNext); 此时head=3.