鱼C论坛

 找回密码
 立即注册
查看: 2252|回复: 4

[已解决]c++链表题答案里有个循环没看懂

[复制链接]
发表于 2019-3-4 09:28:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

                               
登录/注册后可看大图

  1. /**
  2. * Definition for singly-linked list.
  3. * struct ListNode {
  4. *     int val;
  5. *     ListNode *next;
  6. *     ListNode(int x) : val(x), next(NULL) {}
  7. * };
  8. */
  9. class Solution {
  10. public:
  11.    ListNode* reverseBetween(ListNode* head, int m, int n) {
  12.        ListNode *dummy = new ListNode(0), *pre = dummy;
  13.        dummy -> next = head;
  14.        for (int i = 1; i < m; i++) {
  15.            pre = pre -> next;
  16.        }
  17.        ListNode* cur = pre -> next;
  18.        for (int i = 0; i < n - m; i++) {
  19.            ListNode* move = cur -> next;
  20.            cur -> next = move -> next;
  21.            move -> next = pre -> next;
  22.            pre -> next = move;
  23.        }
  24.        return dummy -> next;
  25.    }
  26. };
复制代码

RT,答案中第二个for循环里的
  1. move -> next = pre -> next;
  2. pre -> next = move;
复制代码
为什么pre->next不能换成cur,有大佬教教小白吗,谢谢了
最佳答案
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
这样懂了吗?你在学链表这章的时候,多画图,看链表的节点的指向,就会很容易理解了,如果还是不懂的话再提问
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 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
这样你是否懂了?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-4 14:29:31 From FishC Mobile | 显示全部楼层
暗pluto 发表于 2019-3-4 09:57
你画个指针指向图就知道了
首先,move = cur->next,也就是一开始的关系是这样的  pre->cur->move->xxx
然 ...

这个我懂了,大佬能解释下那两行代码里的pre->next为什么不能换成cur吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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
这样懂了吗?你在学链表这章的时候,多画图,看链表的节点的指向,就会很容易理解了,如果还是不懂的话再提问
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-5 08:36:47 | 显示全部楼层
暗pluto 发表于 2019-3-4 18:39
哦哦哦,我终于知道你说什么了,我还以为你说为什么pre->next不能等于cur呢
是这样的,你如果move->next ...

受教了,谢谢大佬
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-16 17:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表