每日一道算法题--leetcode 206--反转链表--C++

328 阅读1分钟

【题目描述】

【代码思路】

实现链表原地反转,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)就完成了原地反转。

【源代码】

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;
}