方法一:左右指针以及首尾指针
左右指针在交换时记录左右位置,而首尾指针记录反转界限位置。
注意:存在换头时,需要单独进行处理。
例子:
1(pre)->{2->3->4->5->6}->7(pos)->8
其中,{...}内为交换部分。
list_node * reverse_list(list_node * head,int n, int L, int R) { //////在下面完成代码 from L;to R bool isRightEx = (L<=R) && (L>=1) && (R<=n); if(isRightEx){ list_node* cur=head; int count=1; /* 存在换头时,cur所指向的为交换部分第一个;反之,cur指向的为pre */ while( (count+1)!=L && count!=L ){ count++; cur=cur->next; } list_node* pre = cur; list_node* left=NULL; /* 换头时,需要处理count */ if(L==1) count--; else cur=cur->next; while((++count)<=R){ list_node* right = cur->next; cur->next=left; left=cur; cur=right; } list_node* pos=cur; /* 如果需要换头,则最后需要将head换掉;否则,不需要换头 */ if(L==1){ pre->next=pos; head=left; }else{ pre->next->next=pos; pre->next=left; } } return head; }