题目描述
输入一个链表,反转链表后,输出新链表的表头。
思路
通过三个指针来实现。反转链表,希望在时间复杂度和空间复杂度较优,那么最好进过一次历遍就实现。经过分析,需要保存当前节点、上一个节点和后面一个节点。
初始化:开始处理第一个节点的时候,他的下一个节点应该指向空节点。所以将第一个指针p1初始化指向一个空节点。第二个指针p2指向当前节点。第三个指针p3指向后面一个节点。
之后通过循环控制,只要最后一个节点p3不为空,那么就一直进行反转。当前节点p2将链表分为了两段。将p2->next指向p1,不断的处理,将元素添加在前一段。知道p3到达末尾,指向NUll,此时p2为最后一个节点,因为还没有处理,再次添加上就完成了链表的反转。
解答
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* ReverseList(ListNode* pHead) {
if(NULL==pHead) return pHead;
ListNode* p1=NULL;
ListNode* p2=pHead;
ListNode* p3=pHead->next;
while(p3)
{
p2->next=p1;
p1=p2;
p2=p3;
p3=p2->next;
}
p2->next=p1;
return p2;
}
};