题目描述
定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。
struct ListNode
{
int m_nValue;
ListNode* m_pNext;
};
解析
链表反转中,需要三个链表指针,一个指向当前被修改指针域的结点pNode,一个保存上一个结点pPrev,一个保存下一个需要被修改的结点pNext。
实现
ListNode* ReverseList(ListNode* pHead){
if (pHead == NULL)
return NULL;
ListNode* pNode = pHead; //pNode指向当前修改指针的结点
ListNode* pPrev = NULL; //当前修改结点的前一个结点
while (pNode != NULL){
ListNode* pNext = pNode->m_pNext; //需要保持下一个要被修改的结点
pNode->m_pNext = pPrev;
pPrev = pNode;
if (pNext == NULL)
return pNode;
pNode = pNext;
}
}
递归实现
//递归实现
ListNode* ReverseList(ListNode* pHead){
if (pHead == NULL || pHead->m_pNext == NULL)
return pHead;
ListNode* newHead = ReverseList(pHead->m_pNext); //先反转当前结点后面的链表
//完成当前结点后面的链表的反转,此时pHead没有断开与后续链表的链接,可以通过PHead找到已经反转链表的尾结点
pHead->m_pNext->m_pNext = pHead;
pHead->m_pNext = NULL;
return newHead;
}