typedef struct ListNode Node;
/*
* 算法思想:
* 将链表分为三段,index在M与N之间的为第二段,将第二段反转
* 并且记录第一段的尾,第三段的头,用来连接三段链表
*/
struct ListNode* reverseBetween(struct ListNode* head, int m, int n){
Node *p = head;
Node node;node.next = NULL;
Node *rear = &node;
Node *last = NULL;
int i=0;
Node *first = NULL;
Node *back = NULL;
while(p || last){
i++;
last = p;
if(p)
p = p->next;
if(i>=m && i<=n){
/* 将符合条件的节点放到一个临时链表中;
* 并且记录这个链表的头尾;
* 看成链表的第二段链表
*/
last->next = node.next;
if(!node.next){
rear = last;
}
node.next = last;
}else{
if(i == m-1){
back = last;
/* 记录前面第一段链表的尾巴 */
}
if(i == n+1){
/* 记录第三段链表的头 */
first = last;
}
}
}
if(back){
/* 链接第一段与第二段链表 */
back->next = node.next;
/* 链接第二段和第三段链表 */
rear->next = first;
return head;
}else{
/* 第一段链表不存在 */
/* 链接第二段和第三段链表 */
rear->next = first;
return node.next;
}
return NULL;
}
LeetCode-92-反转链表II-C语言
猜你喜欢
转载自blog.csdn.net/weixin_36094222/article/details/90057054
今日推荐
周排行