单链表逆置(递归)
要时时刻刻记着,我们要返回的是当前链表的尾结点,这样的话if和else中的内容就很清楚了。
/*
* 逆置单链表,返回原单链表的尾结点。
*/
LinkList reverseRecursive(LinkList L)
{
if(L == NULL)
return NULL;
LinkList curr, reverseHead, temp;
if(L->next == NULL)
return L;
else
{
curr = L;
temp = L->next;
reverseHead = reverseRecursive(temp);
temp->next = curr;
curr->next = NULL;
}
return reverseHead;
}
单链表逆置(非递归)
根据剑指offer上的讲述,我们访问一个结点pNodet时,我们在将一个结点指向前一个pPrev结点的时候,丢掉了该结点指向它后边的结点,所以需要一个指针pNext将该结点的next保存下来。
所以需要三个指针:pNode, pPrev,pNext
代码如下:
/*
* 逆置单链表,返回表头指针
*/
Node *reverseList(Node *pHead)
{
Node *pReversedHead = NULL;
Node *pNode = pHead;
Node *pPrev = NULL;
while(pNode != NULL)
{
Node *pNext = pNode->next;
if(pNext == NULL)
pReversedHead = pNode;
pNode->next = pPrev;
pPrev = pNode;
pNode = pNext;
}
return pReversedHead;
}