给你单链表的头指针head
和两个整数left
和right
,其中left <= right
。请你反转从位置left
到位置right
的链表节点,返回反转后的链表 。
提示:
- 链表中节点数目为
n
1 <= n <= 500
-500 <= Node.val <= 500
1 <= left <= right <= n
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseBetween(struct ListNode* head, int left, int right){
if( left == right )
return head;
struct ListNode *p, *q, *r, *s;
p = q = r = s = NULL;
int cnt = 0;
struct ListNode *temp;
for( struct ListNode *cur = head; cur; cur = temp ) {
temp = cur->next;
struct ListNode *pre;
cnt ++;
if( cnt < left - 1 )
continue;
else if( cnt == left - 1 )
p = cur;
else if( cnt == left )
q = pre = cur;
else if( cnt > left && cnt <= right ) {
if( cnt == right )
r = cur;
cur->next = pre;
pre = cur;
} else if( cnt == right + 1 ) {
s = cur;
break;
}
}
q->next = s;
if( p ) {
p->next = r;
return head;
} else
return r;
}