题目描述
在写出代码之后,立即用事先准备好的测试用例检查测试。如果面试只是以手写代码的方式,那也要在心里默默运行代码做单元测试,只有保证代码通过测试后,再提交给面试官。
输入一个链表,反转链表后,输出链表的所有元素。
分析:为了正确的反转一个链表,需要调整表中的指针方向。假设把i结点之前的所有结点的m_pNext都指向前一个结点,会导致链表在i和i后的那个结点之间断裂。所以我们需要在调整i结点的m_pNext之前,把i后的结点保存下来。此外还需要i之前的那个结点,因为我们要把i的m_pNext指向i前面的那个结点。
所以相应的我们要定义三个指针,分别指向当前遍历的结点、它的前一个结点和后一个结点。
有了前面的分析,我们写出下面的代码:
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* ReverseList(ListNode* pHead) {
if(pHead==NULL||pHead->next==NULL)
return pHead;
ListNode* pNew=NULL;
ListNode* pNode=pHead;
ListNode* pre=NULL;
while(pNode!=NULL)
{
ListNode* pNext=pNode->next;
if(pNext==NULL)
pNew=pNode;
pNode->next=pre;
pre=pNode;
pNode=pNext;
}
return pNew;
}
};
在写出代码之后,立即用事先准备好的测试用例检查测试。如果面试只是以手写代码的方式,那也要在心里默默运行代码做单元测试,只有保证代码通过测试后,再提交给面试官。