题解 | #反转链表# C++ by meng
反转链表
http://www.nowcoder.com/practice/75e878df47f24fdc9dc3e400ec6058ca
通过两个链表做中间量存储结果
设链表pre和nex为nullptr
假设原链表为 head 1->2->3->nullprt
1.用链表nex 存 tmp下一项的值 ,留作下一轮用
pre = head->next; //那么pre = 2->3->nullptr
2.用链表pre为tmp->next赋值
head->next = pre; //那么此时head = 1->nullptr
3.再将head赋值给pre
pre = head; //此时pre = 1->nullptr
4.最后将nex还给tmp,使得tmp层层递进
head = nex; //head等于原head->next的链表 head = 2->3->nullptr
每轮tmp pre after的输入值输出值
| 轮数 | pre | tmp | after |
|---|---|---|---|
| 1 in | null | 1->2->3->null | null |
| 1 out | 2->3->null | 2->3->null | 1->null |
| - | - | - | - |
| 2 in | 2->3->null | 2->3->null | 1->null |
| 2 out | 3->null | 3->null | 2->1->null |
| - | - | - | - |
| 3 in | 3-null | 3-null | 2-1-null |
| 3 out | null | null | 3->2->null |
由此可以看出nex保存head每次的next项,最终还给head最递进
真正的操作是head->next = pre;即,将先出的值往链表后面放。
每次(如第2轮)把2->[3->null] 换成1->null,得到2->1->null;此时该值还存在head中,需要再nex还给head前(即第四步之前)把head赋给pre做保存。
最终代码体现
class Solution {
public:
ListNode* ReverseList(ListNode* pHead) {
ListNode *pre = nullptr;
ListNode *nex = nullptr;
while(pHead!=nullptr){
nex = pHead->next; //res 2-3-null | 3-null
pHead->next = pre; //pHead 1-null
pre = pHead; //2-3-null
pHead = nex; // 1-null
}
return pre;
}
};