题目:反转链表

第一种解法:双指针

思路如下: 原链表:1→2→3→4(pre=null) 1: null←1 2→3→4(pre=1) 2: null←1←2 3→4(pre=2) 3: null←1←2←3 4(pre=3) 4: null←1←2←3←4(pre=4)

循环终止的条件是:当前节点为nullptr,之后因为在上一次循环中已经指定pre等于上一次循环的curr,因此直接返回pre即可

 1ListNode* reverseList(ListNode* head)
 2    {
 3        ListNode *pre = nullptr;
 4        ListNode *curr = head;
 5        while(curr)
 6        {
 7            ListNode* temp = curr->next;
 8            curr->next = pre;
 9            pre = curr;
10            curr = temp;
11        }
12        return pre;
13    }

第二种解法:递归

总体思路还是在双指针的基础上进行的

reverse函数接收当前节点与上一个节点,如果curr为空,也就是递归到了最后一个节点,就直接返回prev;

若未到达尾节点,就跟双指针解法一样curr和pre都向后移一位,并再次调用reverse(注:此时temp和curr就是移动过后的curr和prev)

在reverseList函数中对reverse的调用也是直接省去了curr和prev的初始化环节

 1ListNode* reverse(ListNode* curr, ListNode* prev)
 2    {
 3        if(curr == nullptr) return prev;
 4        ListNode* temp = curr->next;
 5        curr->next = prev;
 6        return reverse(temp, curr);
 7    }
 8
 9    ListNode* reverseList(ListNode* head)
10    {
11        return reverse(head, nullptr);
12    }