本题目选自July大神博客系列【微软面试100题】:july大神,该系列我主要用来记录我的学习笔记。
题目描述:使用递归和不递归两种方法反转链表。
(本题亦见于《剑指offer》面试题16)
递归方法:
Node *Reverse(Node* pHead)
{
if(pHead == NULL || pHead->next == NULL)
return pHead;
Node* pTemp = Reverse(pHead->next); //递归反转后面的结点
pHead->next->next = pHead; //将当前结点加入到反转后的链表的最后一个位置
pHead->next = NULL;
return pTemp;
}
非递归方法
因在迭代过程中,链表会出现断裂,因此需要3个指针分别保存当前结点、前一结点、后一结点。
Node* ReverseWithRecursive(Node* pHead)
{
if(pHead == NULL)
return pHead;
Node *pNode = pHead; //当前结点
Node *pPre = NULL; //当前结点的前一结点,即反转后,当前结点的后一结点
Node *pNext = NULL; //当前结点的后一结点,即反转后,当前结点的前一结点
while(pNode->next != NULL)
{
pNext = pNode->next;
pNode->next = pPre;
pPre = pNode;
pNode = pNext;
}
pNode->next = pPre;
return pNode;
}