本文主要是介绍剑指Offer16翻转链表,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目:
定义一个函数,输入一个链表的头结点,翻转该链表并输出翻转后链表的头结点。
分析:
这个题刚看的时候可能会和之前遇到的逆序输出链表差不多,不过在那个题目中并没有改变链表的指针,而是通过增加空间来进行逆序输出的,还记得怎么做吗?当然就是增加一个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;
}
这篇关于剑指Offer16翻转链表的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!