这个题确实太容易错了。

我已经做了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;
}

 

posted on 2017-12-11 19:24  newbird2017  阅读(128)  评论(0)    收藏  举报