469826336 发表于 2019-3-4 09:28:16

c++链表题答案里有个循环没看懂

http://m.qpic.cn/psb?/V13DnKFA2b7guU/DRC37I*01VEPAgv3FqwAUz3euqzRUU8eGMnPHoa7w0Q!/b/dL8AAAAAAAAA&bo=pwHSAAAAAAADB1Y!&rf=viewer_4
/**
* Definition for singly-linked list.
* struct ListNode {
*   int val;
*   ListNode *next;
*   ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
   ListNode* reverseBetween(ListNode* head, int m, int n) {
       ListNode *dummy = new ListNode(0), *pre = dummy;
       dummy -> next = head;
       for (int i = 1; i < m; i++) {
         pre = pre -> next;
       }
       ListNode* cur = pre -> next;
       for (int i = 0; i < n - m; i++) {
         ListNode* move = cur -> next;
         cur -> next = move -> next;
         move -> next = pre -> next;
         pre -> next = move;
       }
       return dummy -> next;
   }
};
RT,答案中第二个for循环里的move -> next = pre -> next;
pre -> next = move;为什么pre->next不能换成cur,有大佬教教小白吗,谢谢了

暗pluto 发表于 2019-3-4 09:57:11

你画个指针指向图就知道了
首先,move = cur->next,也就是一开始的关系是这样的pre->cur->move->xxx
然后,cur -> next = move -> next;就变成这样了pre->cur->xxx   且move->xxx(并列关系)
然后,move -> next = pre -> next; 接下来, pre->cur->xxx且move->cur(并列关系)
最后,pre -> next = move; 就完成一次翻转,pre -> move -> cur ->xxx
这样你是否懂了?

469826336 发表于 2019-3-4 14:29:31

暗pluto 发表于 2019-3-4 09:57
你画个指针指向图就知道了
首先,move = cur->next,也就是一开始的关系是这样的pre->cur->move->xxx
然 ...

这个我懂了,大佬能解释下那两行代码里的pre->next为什么不能换成cur吗

暗pluto 发表于 2019-3-4 18:39:50

469826336 发表于 2019-3-4 14:29
这个我懂了,大佬能解释下那两行代码里的pre->next为什么不能换成cur吗

哦哦哦,我终于知道你说什么了,我还以为你说为什么pre->next不能等于cur呢
是这样的,你如果move->next=cur,然后cur=move的话,就会导致pre->next=cur 且 move->next=cur,这样不就矛盾了吗
而且,pre->next 不一定就是cur,第一次循环是cur,但从第二次循环开始,pre->next就和前面的move交换位置了,变成了pre -> move -> cur ->xxx,而你要把xxx变到pre后面,而不是cur前面,自然不能用cur来代替pre->next
这样懂了吗?你在学链表这章的时候,多画图,看链表的节点的指向,就会很容易理解了,如果还是不懂的话再提问

469826336 发表于 2019-3-5 08:36:47

暗pluto 发表于 2019-3-4 18:39
哦哦哦,我终于知道你说什么了,我还以为你说为什么pre->next不能等于cur呢
是这样的,你如果move->next ...

受教了,谢谢大佬{:5_105:}
页: [1]
查看完整版本: c++链表题答案里有个循环没看懂