题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。
链表结点定义:
struct ListNode
{
int m_nValue ;
ListNode* m_pNext ;
} ;
一开始我是先想到递归求解的:
ListNode* ReverseLinkedList(ListNode *pListHead)
{
if(NULL == pListHead)
{
return NULL ;
}
else if(NULL == pListHead->m_pNext) //只有1个结点
{
return pListHead ;
}
ListNode *pNewHead = ReverseLinkedListCore(pListHead,NULL) ;
return pNewHead ;
}
ListNode* ReverseLinkedListCore(ListNode *pCurNode,ListNode *pPrevNode)
{
if(NULL == pCurNode)
{
return NULL ;
}
if(NULL == pCurNode->m_pNext) //到最后一个结点了
{
pCurNode->m_pNext = pPrevNode ; //开始逆转链表
return pCurNode ; //最后一个结点是新的头结点
}
else
{
ListNode *pNewHead = ReverseLinkedListCore(pCurNode->m_pNext,pCurNode) ;
pCurNode->m_pNext = pPrevNode ;
return pNewHead ;
}
}
而书上的解法是非递归的,更加直接和简洁:
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 ;
}