题目:
定义一个函数,输入一个链表的头结点,翻转该链表并输出翻转后链表的头结点。
分析:
这个题刚看的时候可能会和之前遇到的逆序输出链表差不多,不过在那个题目中并没有改变链表的指针,而是通过增加空间来进行逆序输出的,还记得怎么做吗?当然就是增加一个n长度的栈。当然如果题目要求中是可以改变链表的,并且只允许增加常数的空间,那么就和这个题目是一样的解决方法了。
那看这个题怎么解吧!
用这个图来说明,如果我们把3之前的结点都进行了翻转,并且3也把指针指向了前面的结点的话,那么,此时4结点就会找不到了,所以我们需要一个指针指向保存4结点,我们还需要一个指针来指向3前面的一个结点2,这样,我们总共需要3个指针就可以完成逆序了。分别指向当前结点和前后两个结点。
过程:
首先一个指针保存当前结点的后结点,当然如果后结点为空的话,我们就相当于找到了翻转之后的头结点(也就是此时链表的尾结点)。然后将当前结点的next指针指向当前结点的前结点,接下来就要往前移动了,下面包含两步(1,前结点就要指向当前结点了。2,当前结点指向下一个结点)。
过程挺简单,代码中也有优化,下面看代码:
ListNode * ReverseList(ListNode * HeadList)
{
ListNode * pReverseHead = NULL;
ListNode * pNode = HeadList;
ListNode * pVer = NULL;
while(pNode != NULL)
{
ListNode * pNext = pNode->m_pNext;
if(pNext == NULL)
pReverseHead = pNode;
pNode->m_pNext = pVer;
pVer = pNode;
pNode = pNext;
}
return pReverseHead;
}