面试题:16反转链表
题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点,链表结点定义如下:
struct ListNode{
int value;
ListNode * next;
}
分析:链表的逆置之所以时间复杂度比较高的原因还是在于单链表的操作必须要from head to tail,所以部能用普通的思路。只遍历一次链表在这过程中就把链表反转了,普通方法不能做到的原因指针逆置导致了整个链表的断裂。所以在逆转指针时要先保存节点下一个元素,就可以做到只遍历一次就逆转链表了。
ListNode * ReverseList(ListNode * pHead){
ListNode* pReversedHead = NULL;
ListNode* pNode = pHead;
ListNode* pPrev = NULL;
while(pNode != NULL){
ListNode* pNext = pNode->next;
if(pNext == NULL){
pReversedHead = pNode;//反转后的头结点
}
pNode->next = pPrev;
pPrev = pNode;
pNode = pNext;
}
return pReversedHead;
}
遇到的问题:就如标准答案上说的,虽说考虑到了输入的头指针为空的异常情况但是只有一个结点的情况没考虑到。另外事先想好测试也是一个很好的办法,可以验证自己的程序正确性。