难度中等817
给你单链表的头指针 head
和两个整数 left
和 right
,其中 left <= right
。请你反转从位置 left
到位置 right
的链表节点,返回 反转后的链表 。
示例 1:
输入:head = [1,2,3,4,5], left = 2, right = 4 输出:[1,4,3,2,5]
示例 2:
输入:head = [5], left = 1, right = 1 输出:[5]
提示:
- 链表中节点数目为
n
1 <= n <= 500
-500 <= Node.val <= 500
1 <= left <= right <= n
/** * 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 { private: void reverseLinkedList(ListNode *head){//1 2 3 4 5 ListNode *pre = nullptr; // 2 1 3 4 5 ListNode *cur = head; // 3 2 1 4 5 while(cur != nullptr){ ListNode *next = cur->next; cur->next = pre; pre = cur; cur = next; } } public: ListNode* reverseBetween(ListNode* head, int left, int right) { ListNode *newList = new ListNode(-1); newList -> next = head; ListNode *pre = newList; for(int i = 0; i < left-1; i++){ pre = pre->next; } ListNode *rigthNode = pre; for(int i = 0; i < right-left+1; i++){ rigthNode = rigthNode -> next; } ListNode *leftNode = pre->next; ListNode *curr = rigthNode->next; pre->next = nullptr; rigthNode->next = nullptr; reverseLinkedList(leftNode); pre->next = rigthNode; leftNode -> next = curr; return newList->next; } };