给你单链表的头指针 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]
提示:
n1 <= n <= 500-500 <= Node.val <= 5001 <= left <= right <= n- /**
- * Definition for singly-linked list.
- * struct ListNode {
- * int val;
- * struct ListNode *next;
- * };
- */
- void reverse(struct ListNode *p, struct ListNode *q){
- if (p == q) return;
- struct ListNode *tail = p->next;
- reverse(tail, q);
- p->next = tail->next;
- tail->next = p;
- return;
- }
-
- struct ListNode* reverseBetween(struct ListNode* head, int left, int right){
- struct ListNode new_head, *p = &new_head, *q = &new_head;
- new_head.next = head;
- while (left - 1 > 0) p = p->next, left--;
- while (right > 0) q = q->next, right--;
- reverse(p->next, q);
- p->next = q;
- return new_head.next;
- }
- /**
- * Definition for singly-linked list.
- * struct ListNode {
- * int val;
- * struct ListNode *next;
- * };
- */
-
- struct ListNode* reverseBetween(struct ListNode* head, int left, int right){
- if (left == 1 && right == 1) return head;
- if (left != 1) {
- head->next = reverseBetween(head->next, left - 1, right - 1);
- }else {
- struct ListNode *new_head, *tail = head->next;
- new_head = reverseBetween(head->next, left, right - 1);
- head->next = tail->next;
- tail->next = head;
- head = new_head;
- }
- return head;
- }