递归实现:
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;
}
}
其实递归的方式一般就是把循环的问题变成分两步就能解决的问题。第一步求当前问题,第二步求子问题(递归调用自身函数);或者第一步求子问题,第二步求当前问题(比如本题)。
递归方式解决问题的时候解题思路通常都很明朗,因为这时就当做子问题是已知的,只需递归调用自身函数就能实现(如
ListNode * newhead=ReverseList2(head->m_pNext);
//先反转后面的链表)。不需要考虑太多别的。
非递归实现:
ListNode* ReverseList(ListNode* pHead)
{
ListNode* pReversedHead = NULL;
ListNode* pNode = pHead;
ListNode* pPrev = NULL;
while(pNode != NULL)
{
ListNode* pNext = pNode->m_pNext;
if(pNext == NULL)
pReversedHead = pNode;
pNode->m_pNext = pPrev;
pPrev = pNode;
pNode = pNext;
}
return pReversedHead;
}
(1)修改当前结点的指向之前,要已知当前结点的上一个结点;
(2)要想已知当前结点的上一个结点,就要在修改当前结点的指向之前,保存当前结点的下一个结点;
(3)别忘了原来的头结点反转后要指向NULL。