给你单链表的头指针 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; * 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; }