Leetcode 题解 reverse List II

时间:2021-01-30 08:49:25

这个题确实太容易错了。

我已经做了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 = ; i < m-;i++) //找到m前边那个    i表示当前pm指向的是哪个。初始pm指向第0个,最后指向第m-1个。出口(i = m-1)
{
pm = pm->next;
}
pn = dummy;
for(i = ; 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;
}