/**
* 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->next == NULL || head == NULL)
return head;
struct ListNode* H = malloc(sizeof(struct ListNode));
H->next = head;
struct ListNode *p,*temp,*cur=H;
//定位反转区间
for (int i = 0; i < m - 1; i++) {
cur = cur->next;
}
temp = cur; //区间的头结点
struct ListNode* q;
cur = cur->next; //反转区间第一个节点
q = cur; //保存反转区间第一个节点的地址
//头插法反转链表
for (int i = 0; i < n - m + 1; i++) {
//要反转的第一个结点
p = cur;
p->next = temp->next;
temp->next = p;
cur = cur->next;
}
//头插法以后区间第一个结点的地址已经被反转到区间最后一个地址,此时,要将他指向原来区间最后一个结点指向的地址
//否则他会一直指向自己的地址。因此第一次头插法使得p指向p自己。
q->next = cur; //反转区间第一个节点与原链表反转区间后的第一个节点相连
return H->next;
}