题目:反转链表
第一种解法:双指针
思路如下: 原链表: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 }