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

【题目描述】

【代码思路】

实现链表原地反转,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;
    }
};


 

猜你喜欢

转载自blog.csdn.net/transformed/article/details/88645091