/* 很多坑!! 思路是这样的,翻转链表其实就是翻转指针,从入口开始第一个的后一个,每一个都指向前面,然后入口的next 指向最后一个;此时注意第一个的next我们没动,所以要指向最后一个的原来的next 现在想想还是写个专门翻转的函数,返回俩头,但要返回指针的指针 */ ListNode* reverseBetween(ListNode* head, int m, int n) { if(m ==n) return head; ListNode* dummy = new ListNode(0); dummy -> next = head; ListNode* pre = dummy; for(int i= 1; i< m; i++){ pre = pre -> next; } ListNode* cur(pre -> next -> next); ListNode* rtail(pre -> next); for(int i = 0; i< n-m;i++){ ListNode * tmp =cur -> next; cur -> next = pre -> next; pre -> next = cur; cur = tmp; } rtail -> next = cur; return dummy -> next; }
ptail(){ if(!pflag) ratfor ? rtail() : ctail(); pflag = 1; }