【题目描述】
【代码思路】
实现链表原地反转,p指针指向当前正在操作的结点,pre指针指向未反转以前p的前驱结点,假设已经完成了头结点指向NULL的操作,此时pre指针指向1结点,p指针指向2结点,
如果此时我们让p->next=pre,那么我们就无法再找到3结点了,所以此时需要新增一个指针用来指向3结点,所以需要先用q=p->next,将3结点的地址保存起来,然后再执行p->next=pre,就变成了下面这样
此时我们再将pre=p和p=q,变成下图
就如同开始一样,可以在循环中一直进行,直到不满足判断条件while(p!=NULL)就完成了原地反转。
【源代码】
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* p=head;
ListNode* pre=NULL;
while(p!= NULL)
{
ListNode* q=p->next;
p->next=pre;
pre=p;
p=q;
}
return pre;
}
};