思路:获取要反转的区间,拆开之后进行反转再拼接
/*** 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* reverseBetween(ListNode* head, int m, int n) {// write code here ListNode* temp = new ListNode(0);temp->next = head;ListNode* left = temp;//left为前段不反转的最后一个节点for(int i = 0; i<m-1; i++){left = left->next;}ListNode* right = left;//right为反转区间的最后一个节点for(int i = 0; i<n-m+1; i++){right = right->next;}//leftNode为反转区间的第一个节点ListNode *leftNode = left->next;//RightNode为后段不反转区间的第一个节点ListNode *RightNode = right->next;//前段不反转的最后一个节点之后断开left->next = nullptr;//后段不反转的第一个节点之前断开right->next = nullptr;//对反转区间进行反转之后,leftNode为最后一个节点,right为第一个节点ReverseList(leftNode);left->next = right;leftNode->next = RightNode;return temp->next;}void ReverseList(ListNode* head){ListNode* ret = nullptr;ListNode* temp = nullptr;ListNode* result = head;while(result){temp = result->next;result->next = ret;ret = result;result = temp;}}};