给你单链表的头指针head和两个整数left和right,其中left <= right。请你反转从位置left到位置right的链表节点,返回反转后的链表 。

提示:
- 链表中节点数目为
n 1 <= n <= 500-500 <= Node.val <= 5001 <= 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;
}
199

被折叠的 条评论
为什么被折叠?



