题解 | #链表内指定区间反转#
链表内指定区间反转
https://www.nowcoder.com/practice/b58434e200a648c589ca2063f1faf58c
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类
* @param m int整型
* @param n int整型
* @return ListNode类
*/
struct ListNode* reverseBetween(struct ListNode* head, int m, int n ) {
// write code here
if(head == NULL || m == n || head->next == NULL){
return head;
}
struct ListNode* p = (struct ListNode*)malloc(sizeof(struct ListNode));
p->next = head; //想定义一个空的节点,然后让它指向头节点,再将头节点指针指向它
head = p;
for(int i = 0; i < m - 1; i++){
p = p->next; //找到需要转换的第一个节点的前一个结点
}
printf("%d",p->val);
int size = n - m;
struct ListNode* h = p->next, *q = NULL;
struct ListNode* next = h->next;
//h为第一个需要转换的节点
for(int i = 0; i <= size; i++){
h->next = q;
q = h;
h = next;
next = h->next;
}
p->next->next = h; //将转换完成后的最后一个节点指向原本转换区间的下一个节点
p->next = q; //转换完成后,将转换区间的前一个结点指向转换完成后第一个节点
return head->next;
}
