思路:獲取要反轉的區間,拆開之后進行反轉再拼接
/*** 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;}}};