这个题确实太容易错了。
我已经做了2遍了,之前都是套用reverse List 1中的函数。
现在尝试用新方法,在一个函数里完成,结果又错了。
事实证明,永远不要想当然!!!白板编程真的是要求,你对每一行代码都知道在做什么!尤其是边界条件。
因为没有编译调试环境,写错了,你根本看不出来,没有修改的机会啊!!
要求一遍就过啊!
这太难了。看看我提交的这些题目,几个是一遍就过的???都是写完先跑一遍再说,有错再慢慢改!!
毛病啊!!
struct ListNode* reverseBetween(struct ListNode* head, int m, int n) { if( m >= n) return head; struct ListNode * dummy = (struct ListNode *)malloc(sizeof(struct ListNode)); dummy->next = head; struct ListNode* pm, *pn,*pre,*last,*mid; int i; pm = dummy; for(i = 0; i < m-1;i++) //找到m前边那个 i表示当前pm指向的是哪个。初始pm指向第0个,最后指向第m-1个。出口(i = m-1) { pm = pm->next; } pn = dummy; for(i = 0; i < n; i ++) //初始指向第0个,最后指向第n个 { pn = pn ->next; } mid = pm->next; last = pn->next; // 这里太他妈容易错了!!! while(mid != pn->next) 因为当mid = pn的循环,pn->next的值就被改变了! struct ListNode *end = pn->next; while(mid != end) { pre = mid->next; mid->next = last; last = mid; mid = pre; } pm->next = last; mid = dummy->next; free(dummy); return mid; }
浙公网安备 33010602011771号