• 206.反转链表 :::info 不用额外空间 ::: 代码:(详细注释)

    双指针法
    翻转链表 - 图1

    1. class Solution {
    2. public:
    3. ListNode* reverseList(ListNode* head) {
    4. ListNode* temp; // 保存cur的下一个节点
    5. ListNode* cur = head;
    6. ListNode* pre = NULL;
    7. while(cur) {
    8. temp = cur->next; // 保存一下 cur的下一个节点,因为接下来要改变cur->next
    9. cur->next = pre; // 翻转操作
    10. // 更新pre 和 cur指针
    11. pre = cur;
    12. cur = temp;
    13. }
    14. return pre;
    15. }
    16. };

    递归法
    逻辑跟双指针一模一样,只是写法不同

    class Solution {
    public:
        ListNode* reverse(ListNode* pre,ListNode* cur){
            if(cur == NULL) return pre;
            ListNode* temp = cur->next;
            cur->next = pre;
            // 可以和双指针法的代码进行对比,如下递归的写法,其实就是做了这两步
            // pre = cur;
            // cur = temp;
            return reverse(cur,temp);
        }
        ListNode* reverseList(ListNode* head) {
            // 和双指针法初始化是一样的逻辑
            // ListNode* cur = head;
            // ListNode* pre = NULL;
            return reverse(NULL, head);
        }
    
    };
    

    分析:
    这处地方的递归和循环之间的转换太精彩了!!