/** * struct ListNode { * int val; * struct ListNode *next; * }; */ /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param head ListNode类 * @param m int整型 * @param n int整型 * @return ListNode类 */ typedef struct ListNode* Listlink; Listlink reverseList(Listlink L); Listlink reverse(Listlink pre,Listlink cru); int NumList(Listlink L); struct ListNode* reverseBetween(struct ListNode* head, int m, int n ) { // write code here if(m==1&&n==1) return head; Listlink start,end; //start与end节点均保持在不翻转的链表中 Listlink h,e; //h,e分别为反转部分的头尾 int num=NumList(head); if(m==1&&n==num){ head=reverseList(head); return head; } int i; start=head; e=head; //首先,找到链表的m-1个元素 for(i=1;i<m-1;i++){ start=start->next; } //找到链表的第n个元素 for(i=1;i<n;i++){ e=e->next; } //标记反转部分的起点、终点 //将不反转的部分分离出去 end=e->next; e->next=NULL; //处理开始部分的特殊情况 if(m==1) h=start; else{ h=start->next; start->next=end; } e=reverseList(h); //反转后,反转部分的最后一个节点成为反转部分的头结点 if(m==1){ head=e; h->next=end; return head; } start->next=e; h->next=end; return head; } Listlink reverseList(Listlink L){ if(L==NULL||L->next==NULL) return L; L=reverse(NULL,L); return L; } Listlink reverse(Listlink pre,Listlink cru){ if(cru==NULL) return pre; Listlink temp; temp=cru->next; cru->next=pre; return reverse(cru,temp); } int NumList(Listlink L){ int cot=0; Listlink p=L; if(L==NULL) return cot; while(p){ p=p->next; cot++; } return cot; }