鱼C论坛

 找回密码
 立即注册
查看: 1960|回复: 10

为什么代码换了位置head结果完全不一样了,但逻辑是相同的

[复制链接]
发表于 2022-9-3 12:29:39 | 显示全部楼层 |阅读模式
60鱼币
本帖最后由 李万金 于 2022-9-3 12:30 编辑

https://leetcode.cn/problems/remove-duplicates-from-sorted-list/
Leecode的83题,想不明白,不知道为什么。
为什么代码互换位置head结果完全不一样了,但逻辑不是相同的吗

还有一个帖子,也是数据结构方面的,发错位置了
数据结构 链表 Leecode 很基础的问题
https://fishc.com.cn/thread-217304-1-1.html
(出处: 鱼C论坛)

screenshots.gif
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-3 12:45:50 | 显示全部楼层
先去学汇编语言,然后再学一遍C语言,然后再学数据结构与算法 会更好理解
当然,汇编语言对你学习数据结构很有帮助,算法更考验你的数学功底

万丈高楼平地起
你得先学加减法,然后才能学乘除法
你不能还没有学会走,就要学跑
慢慢来吧,急不得
水到渠成,其实很多问题靠自己就可以解决
先去学汇编语言吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-3 13:31:52 | 显示全部楼层
本帖最后由 ba21 于 2022-9-3 13:36 编辑

”数据结构 链表 Leecode 很基础的问题“
这问题我也看过,我觉得版主解释的很清楚,所以没有再发,如果你没能懂,那么说你的基础不行。基础不行只能从基本的说起。

1.首先你注释中给出了ListNode的数据结构
function ListNode(val, next){
        this.val = (val===undefined ? 0 : val)
        this.next = (next===undefined ? null : next)
}
这个结果说明了ListNode这个结构中有2个变量val和next

2.链表和数组类似,数组是连续存放的,而链表则是后一个节点的位置由前一个节点的数据得知
从最基本的说起也就是说只要知道头节点(第1个节点)的内容,那么后面所有节点的位置及内容都可以遍历出来
就该题来说 节点数据是 ListNode,保存数据的变量是val, 而next是用于存下一个节点位置的变量



3. 图解:
202293_133545.png

4.
?左边题目框出的l1,l2是链表,
没错l1, l2是链表,在你框中只是说明你这2个链表所有节点val部份的值。

我们说的链表,通常是指 头节点(第1个节点)。

当你听到 l1链表,那么你就应该知道其实就是指 l1链表的头节点(第1个节点)


?那函数中的l1,l2
传入的链表(头节点(第1个节点))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-9-3 14:52:40 | 显示全部楼层
本帖最后由 李万金 于 2022-9-3 14:54 编辑
人造人 发表于 2022-9-3 12:45
先去学汇编语言,然后再学一遍C语言,然后再学数据结构与算法 会更好理解
当然,汇编语言对你学习数据结构 ...


谢谢,我问的不是这个问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-9-3 15:13:52 | 显示全部楼层
ba21 发表于 2022-9-3 13:31
”数据结构 链表 Leecode 很基础的问题“
这问题我也看过,我觉得版主解释的很清楚,所以没有再发,如果你 ...

谢谢,两篇帖子的问题不一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-3 18:01:14 | 显示全部楼层
李万金 发表于 2022-9-3 14:52
谢谢,我问的不是这个问题

随便了,这只是建议,建议你学数据结构与算法之前先学汇编语言
汇编语言对你学习数据结构很有帮助,听不听就和我没关系了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-3 22:03:13 | 显示全部楼层
李万金 发表于 2022-9-3 15:13
谢谢,两篇帖子的问题不一样

先不淡该题 。
先说说你这个提问的方式
1.你整个动态gif图,估计你懂,我是看不来。建议你上静图,指出问题 所在。
2.提问该展示代码的地方应以文字的形式传上来

所以你先把提问内容简单明了的表达出来,要让人一看就知道你要问什么。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-9-5 09:13:08 | 显示全部楼层
人造人 发表于 2022-9-3 18:01
随便了,这只是建议,建议你学数据结构与算法之前先学汇编语言
汇编语言对你学习数据结构很有帮助,听不 ...

汇编我学过,有没有帮助因人而异
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-6 14:34:20 | 显示全部楼层
本帖最后由 人造人 于 2022-9-6 15:02 编辑
李万金 发表于 2022-9-5 09:13
汇编我学过,有没有帮助因人而异


那你反汇编看一下么,单步调试程序么
一条指令一条指令的执行,看head这个数据结构在内存中的布局,看各个寄存器的值,看看换了位置后,在哪个寄存器的值变了
有很好的工具却不懂得使用怎么能行?
在汇编语言面前,数据结构什么也没有隐藏,也无法隐藏
你一条指令一条指令的执行程序,寄存器中的值你都可以看到,怎么就无法理解这个程序?
调试程序去,一条指令一条指令的执行
手里有很好的工具要懂得去使用,手里有汇编语言这么强大的工具不会用就等于没有
main.o:     file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <delete_duplicates>:
    size_t val;
    struct list_tag_t *next;

} list_t;

list_t *delete_duplicates(list_t *head) {
   0:        55                           pushq  %rbp
   1:        48 89 e5                     movq   %rsp,%rbp
   4:        48 89 7d e8                  movq   %rdi,-0x18(%rbp)
    if(!head) return head;
   8:        48 83 7d e8 00               cmpq   $0x0,-0x18(%rbp)
   d:        75 06                        jne    15 <delete_duplicates+0x15>
   f:        48 8b 45 e8                  movq   -0x18(%rbp),%rax
  13:        eb 60                        jmp    75 <delete_duplicates+0x75>
    list_t *fast = head;
  15:        48 8b 45 e8                  movq   -0x18(%rbp),%rax
  19:        48 89 45 f0                  movq   %rax,-0x10(%rbp)
    list_t *slow = head;
  1d:        48 8b 45 e8                  movq   -0x18(%rbp),%rax
  21:        48 89 45 f8                  movq   %rax,-0x8(%rbp)
    while(fast) {
  25:        eb 37                        jmp    5e <delete_duplicates+0x5e>
        if(slow->val != fast->val) {
  27:        48 8b 45 f8                  movq   -0x8(%rbp),%rax
  2b:        48 8b 10                     movq   (%rax),%rdx
  2e:        48 8b 45 f0                  movq   -0x10(%rbp),%rax
  32:        48 8b 00                     movq   (%rax),%rax
  35:        48 39 c2                     cmpq   %rax,%rdx
  38:        74 18                        je     52 <delete_duplicates+0x52>
            slow->next = fast;
  3a:        48 8b 45 f8                  movq   -0x8(%rbp),%rax
  3e:        48 8b 55 f0                  movq   -0x10(%rbp),%rdx
  42:        48 89 50 08                  movq   %rdx,0x8(%rax)
            slow = slow->next;
  46:        48 8b 45 f8                  movq   -0x8(%rbp),%rax
  4a:        48 8b 40 08                  movq   0x8(%rax),%rax
  4e:        48 89 45 f8                  movq   %rax,-0x8(%rbp)
        }
        fast = fast->next;
  52:        48 8b 45 f0                  movq   -0x10(%rbp),%rax
  56:        48 8b 40 08                  movq   0x8(%rax),%rax
  5a:        48 89 45 f0                  movq   %rax,-0x10(%rbp)
    while(fast) {
  5e:        48 83 7d f0 00               cmpq   $0x0,-0x10(%rbp)
  63:        75 c2                        jne    27 <delete_duplicates+0x27>
    }
    slow->next = NULL;
  65:        48 8b 45 f8                  movq   -0x8(%rbp),%rax
  69:        48 c7 40 08 00 00 00         movq   $0x0,0x8(%rax)
  70:        00 
    return head;
  71:        48 8b 45 e8                  movq   -0x18(%rbp),%rax
}
  75:        5d                           popq   %rbp
  76:        c3                           retq

这不反汇编代码放在这了,你哪里看不懂?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-6 14:37:10 | 显示全部楼层
李万金 发表于 2022-9-5 09:13
汇编我学过,有没有帮助因人而异

编程语言只是工具而已,你学过汇编语言,但是不会用就等于没有学过
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-17 18:21:26 | 显示全部楼层
你可以用一下三指针法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-21 22:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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