剑指 Offer 24. 反转链表 - 力扣(LeetCode) (leetcode-cn.com)
/**
 * 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* pre=nullptr;
        ListNode* cur=head;
        while(cur)
        {
            ListNode* nextnode=cur->next;
            cur->next=pre;
            pre=cur;
            cur=nextnode;
        }
        return pre;
        // if(head==NULL) return NULL;
        // if(head->next == NULL) return head;
        // ListNode* last = reverseList(head->next);
        // head->next->next = head;
        // head->next = NULL;
        // return last;
    }
};
注释掉的是递归写法
92. 反转链表 II - 力扣(LeetCode) (leetcode-cn.com)
递归写法,如果left==1,则进入reverseN函数,反转[1,right]的结点。
reverseN函数中,要记录下第right+1个结点,当区间内的反转完成后要让头指针指向那个right+1结点。
left-1,right-1这里就是记录到当前头节点的相对距离,head结点每次往后一个结点,相对距离就要减1,当left==1的时候就变成了reverseN的情况。
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* node=nullptr;
    ListNode* reverseBetween(ListNode* head, int left, int right) {
        if(head==nullptr) return nullptr;
        if(left==1)
        {
            return reverseN(head,right);
        }
        head->next=reverseBetween(head->next,left-1,right-1);
        return head;
    }
    ListNode* reverseN(ListNode* head,int n)
    {
        if(n==1)
        {
            node=head->next;
            return head;
        }
        ListNode* last=reverseN(head->next,n-1);
        head->next->next=head;
        head->next=node;
        return last;
    }
};
leetcode(剑指offer 24)-反转链表C++实现
原文:https://www.cnblogs.com/Jessicax/p/14961563.html