本题思路是先定义区间时,找到区间的前一个结点并记录,然后在需要翻转的区间中,执行翻转程序, 程序思路:逐步翻转,一次翻转两个指针的指向,翻转的次数是n-m次,可以画图理解 (提示:本代码可以选择是否加上对于NULL的判断,防止访问NULL的next,实际上n,m的大小应该就会限制这种情况,看个人喜好是否加上) struct ListNode* reverseBetween(struct ListNode* head, int m, int n ) { if(head==NULL||head->next==NULL) { return head; } else { struct ListNode* New=(struct ListNode*)malloc(sizeof(struct ListNode)); New->next=head;//设置头结点是为了防止区域一开始就是第一个结点。 struct ListNode* prev,*cur,*tail; prev=New; for(int i=0;i<m-1;i++) { prev=prev->next;//这里得到交换区域前一个结点。 } cur=prev->next;//将交换区的第一个结点给cur。 for(int j=0;j<n-m;j++) { tail=cur->next; cur->next=tail->next; tail->next=prev->next; prev->next=tail; } return New->next;//返回New的next,因为New中多分配了一个结点,会导致输出有误。 } }