为什么代码换了位置head结果完全不一样了,但逻辑是相同的
本帖最后由 李万金 于 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论坛)
先去学汇编语言,然后再学一遍C语言,然后再学数据结构与算法 会更好理解
当然,汇编语言对你学习数据结构很有帮助,算法更考验你的数学功底
万丈高楼平地起
你得先学加减法,然后才能学乘除法
你不能还没有学会走,就要学跑
慢慢来吧,急不得
水到渠成,其实很多问题靠自己就可以解决
先去学汇编语言吧
本帖最后由 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. 图解:
4.
?左边题目框出的l1,l2是链表,
没错l1, l2是链表,在你框中只是说明你这2个链表所有节点val部份的值。
我们说的链表,通常是指 头节点(第1个节点)。
当你听到 l1链表,那么你就应该知道其实就是指 l1链表的头节点(第1个节点)
?那函数中的l1,l2
传入的链表(头节点(第1个节点))
本帖最后由 李万金 于 2022-9-3 14:54 编辑
人造人 发表于 2022-9-3 12:45
先去学汇编语言,然后再学一遍C语言,然后再学数据结构与算法 会更好理解
当然,汇编语言对你学习数据结构 ...
谢谢,我问的不是这个问题 ba21 发表于 2022-9-3 13:31
”数据结构 链表 Leecode 很基础的问题“
这问题我也看过,我觉得版主解释的很清楚,所以没有再发,如果你 ...
谢谢,两篇帖子的问题不一样 李万金 发表于 2022-9-3 14:52
谢谢,我问的不是这个问题
随便了,这只是建议,建议你学数据结构与算法之前先学汇编语言
汇编语言对你学习数据结构很有帮助,听不听就和我没关系了
李万金 发表于 2022-9-3 15:13
谢谢,两篇帖子的问题不一样
先不淡该题 。
先说说你这个提问的方式
1.你整个动态gif图,估计你懂,我是看不来。建议你上静图,指出问题 所在。
2.提问该展示代码的地方应以文字的形式传上来
所以你先把提问内容简单明了的表达出来,要让人一看就知道你要问什么。 人造人 发表于 2022-9-3 18:01
随便了,这只是建议,建议你学数据结构与算法之前先学汇编语言
汇编语言对你学习数据结构很有帮助,听不 ...
汇编我学过,有没有帮助因人而异 本帖最后由 人造人 于 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
这不反汇编代码放在这了,你哪里看不懂?
李万金 发表于 2022-9-5 09:13
汇编我学过,有没有帮助因人而异
编程语言只是工具而已,你学过汇编语言,但是不会用就等于没有学过
你可以用一下三指针法
页:
[1]