题解 | #反转链表# C++实现
反转链表
http://www.nowcoder.com/practice/75e878df47f24fdc9dc3e400ec6058ca
反转单链表,C++实现
struct ListNode{
int val;
ListNode* next;
ListNode(int x):val(x),next(NULL){}
};
class Solution {
public:
ListNode* ReverseList(ListNode* pHead) {
//最好是加上传入指针非空的判断,更规范
if(pHead==NULL){
return NULL;
}
//记住反转单链表没有用到虚拟头节点,而是双指针
ListNode* p1=NULL;
ListNode* p2=pHead;
while(p2!=NULL){
ListNode* temp=p2->next;//注意要用到一个临时节点
p2->next=p1;//先干主要的,换向,注意不要写反了
p1=p2;//由于p1和p2之间指针已经被反向,一旦p2前进,会导致p1无法访问到下一个节点,所以需要先动p1,且p1的移动是靠p2来完成的
p2=temp;//p2和temp之间是断层的,最后p2的移动是依赖temp完成的
}
return p1;//注意最后返回的不是head
}
};
注意:
- 参数只有一个,链表头指针,传入时要进行非空判断
- 左指针初始化时指向的是NULL
- 临时指针是在循环内部创建的
- 先换向,再将两个指针步进
- 最后返回的是左指针,不是head