剑指Offer16翻转链表

来源:互联网 发布:9.9元淘宝斜挎包女包 编辑:程序博客网 时间:2024/06/03 08:00

题目:

定义一个函数,输入一个链表的头结点,翻转该链表并输出翻转后链表的头结点。

分析:

这个题刚看的时候可能会和之前遇到的逆序输出链表差不多,不过在那个题目中并没有改变链表的指针,而是通过增加空间来进行逆序输出的,还记得怎么做吗?当然就是增加一个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;}


0 0