鱼C论坛

 找回密码
 立即注册
查看: 1464|回复: 8

[已解决]刚开始在力扣刷题的疑问

[复制链接]
发表于 2022-8-15 20:39:41 | 显示全部楼层 |阅读模式

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

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

x
刚刚在力扣刷题,搞不懂这个代码要怎么写,思路我懂,就是格式好像平台有限制
题目
IMG_20220815_202950.jpg
作答区域:
1660566960690.jpg
答案:
class Solution:
    def reversePrint(self, head: ListNode) -> List[int]:
        stack = []
        while head:
            stack.append(head.val)
            head = head.next
        return stack[::-1]
我不理解这个head, head.next 以及 head.val
这是什么条件呢
谢谢大佬们看一下,不知道你们去力扣做过题没
最佳答案
2022-8-16 07:47:43
可能你不太理解什么是链表,所以无法理解这里的head、head.next、head.val。

先来画一个草图让你理解什么是链表:
['hi']--> ['Python']--> [0.618]--> [False]-->None
这就是一个链表的示意图,先来理解它的结构特点。
一个链条是由相互连接的小环组成,以上链表都是由[ ]-->结构组成的,这就是节点你也可以理解成链条上的一环。
真实链条中的一环(除了开头和结尾)既连接着前一环也连接着下一环,而我们的节点因为只有一个-->所以它只能看到下一环是什么,也就是说示意图展示的是一个单向链表
我们当然可以再增加一个<--,让每个节点变为<--[ ]-->,由这样的节点构成的链表就是双向链表。不过题目中给的是单向链表,所以我们就不再讨论双向链表了。

说回节点,对于任意一个节点来说它都要保存至少两项数据:值和下一个节点。示意图中值保存在[ ]中,-->指向下一个节点。
所以上述链表保存了思想数据,它们分别是'hi'、'Python'、0.618和False。再来看[False]-->None这个节点,为什么我们说它是最后一个节点呢?
真实情况下,这些节点保存在内存中不同位置,我们的眼睛看不到。以上链表只是“示意图”,省去了干扰我们的其他因素。之所以我们说[False]-->None是最后一个节点,因为它指向None而不是其他节点。

现在我猜你应该已经理解了链表与节点的关系(链表其实是由一个一个节点组成的,每个节点要么指向下一节点要么指向None)以及如何判断最后一个节点。
但这还不够,因为上面的那个节点其实我们根本无法访问其中的数据,'hi'、'Python'、0.618这些数据其实我们都访问不到。因为我们没有头节点
由于这是一个单向链表,只有理解了开头在哪里我们才能逐个访问节点直到末尾。虽然在视觉上我们可以把['hi']-->当作头节点,但在程序中我们需要手动把头节点赋值给一个变量,如此一来我们才能借助这个变量访问各个节点保存的数据。

你需要理解这些内容:节点、节点保存两项数据(值和下一节点)、头节点。
说了这么多,再来看看代码怎么写。请再看一遍题目,第2行到第5行被注释掉的部分就是一个表示链表节点的类:
class ListNode(object):
    def __init__(self, x):
        self.val = x
        self.next = None
前面我们已经知道了每个节点至少要保存两项数据,这个类的构造函数__init__中确实设置了两个属性val和next。
val保存的就是值,next保存下一个节点。默认情况下节点不指向任何节点,所以self.next = None

接下来我们使用上述节点类来创建一个链表:
class ListNode(object):
    def __init__(self, x):
        self.val = x
        self.next = None


head = ListNode('hi')  # 头节点很重要,没有它以后就无法访问其他节点了
# 接下来为head增加一个新节点,方法有二,其实是一样的
# 方法一:
nd = ListNode('Python')
head.next = nd  # 手动让头节点的next指向下一个节点

# 方法二:
# head.next = ListNode('Python')

# 增加第三个节点
nd.next = ListNode(0.618)

# 增加最后一个节点
nd.next.next = ListNode(False)

print(f'头节点的值{head.val}')
print(f'下一节点的值{head.next.val}')

# 如果节点的next属性指向None则说明这个节点就是末尾了
# 所以如下代码可以遍历整个链表
current = head  # 一定要赋值,不能直接对head操作,否则以后无法访问到链表中的数据了
n = 1  # 只是为了计数,演示用
while current is not None:
    print(f'第{n}个节点的值是{current.val}')
    n += 1
    current = current.next  # 这一行很重要,让current指向下一节点,没有这一行程序会陷入死循环

# 到达最后一个节点时current.next的值就是None
# 所以经过current = current.next这一样代码后current is not None这个条件不成立,循环自动退出。

以上就是关于链表的head、head.next、head.val的解释,如果还有问题请继续提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-15 20:41:48 | 显示全部楼层
面向对象的写法
head就是指定头节点
head.val就是上面的类ListNode实例化出来的对象中的val属性
那么next也是对象的属性
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-15 21:37:36 | 显示全部楼层
ZhKQYu 发表于 2022-8-15 20:41
面向对象的写法
head就是指定头节点
head.val就是上面的类ListNode实例化出来的对象中的val属性

还是有点不理解,主要是没学过头节点什么的
head 是通过什么实例成ListNode的对象的?head:ListNode吗?
我去网上查了查,说是什么链表结构,教程有两三个多小时,我可能不需要
大佬能帮我简单讲一下就现在这个例子吗?就head是具体干什么的,head.next和head.val 在这个题中有什么用
-> List[int]有什么用
谢谢大佬,万分感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-16 07:47:43 | 显示全部楼层    本楼为最佳答案   
可能你不太理解什么是链表,所以无法理解这里的head、head.next、head.val。

先来画一个草图让你理解什么是链表:
['hi']--> ['Python']--> [0.618]--> [False]-->None
这就是一个链表的示意图,先来理解它的结构特点。
一个链条是由相互连接的小环组成,以上链表都是由[ ]-->结构组成的,这就是节点你也可以理解成链条上的一环。
真实链条中的一环(除了开头和结尾)既连接着前一环也连接着下一环,而我们的节点因为只有一个-->所以它只能看到下一环是什么,也就是说示意图展示的是一个单向链表
我们当然可以再增加一个<--,让每个节点变为<--[ ]-->,由这样的节点构成的链表就是双向链表。不过题目中给的是单向链表,所以我们就不再讨论双向链表了。

说回节点,对于任意一个节点来说它都要保存至少两项数据:值和下一个节点。示意图中值保存在[ ]中,-->指向下一个节点。
所以上述链表保存了思想数据,它们分别是'hi'、'Python'、0.618和False。再来看[False]-->None这个节点,为什么我们说它是最后一个节点呢?
真实情况下,这些节点保存在内存中不同位置,我们的眼睛看不到。以上链表只是“示意图”,省去了干扰我们的其他因素。之所以我们说[False]-->None是最后一个节点,因为它指向None而不是其他节点。

现在我猜你应该已经理解了链表与节点的关系(链表其实是由一个一个节点组成的,每个节点要么指向下一节点要么指向None)以及如何判断最后一个节点。
但这还不够,因为上面的那个节点其实我们根本无法访问其中的数据,'hi'、'Python'、0.618这些数据其实我们都访问不到。因为我们没有头节点
由于这是一个单向链表,只有理解了开头在哪里我们才能逐个访问节点直到末尾。虽然在视觉上我们可以把['hi']-->当作头节点,但在程序中我们需要手动把头节点赋值给一个变量,如此一来我们才能借助这个变量访问各个节点保存的数据。

你需要理解这些内容:节点、节点保存两项数据(值和下一节点)、头节点。
说了这么多,再来看看代码怎么写。请再看一遍题目,第2行到第5行被注释掉的部分就是一个表示链表节点的类:
class ListNode(object):
    def __init__(self, x):
        self.val = x
        self.next = None
前面我们已经知道了每个节点至少要保存两项数据,这个类的构造函数__init__中确实设置了两个属性val和next。
val保存的就是值,next保存下一个节点。默认情况下节点不指向任何节点,所以self.next = None

接下来我们使用上述节点类来创建一个链表:
class ListNode(object):
    def __init__(self, x):
        self.val = x
        self.next = None


head = ListNode('hi')  # 头节点很重要,没有它以后就无法访问其他节点了
# 接下来为head增加一个新节点,方法有二,其实是一样的
# 方法一:
nd = ListNode('Python')
head.next = nd  # 手动让头节点的next指向下一个节点

# 方法二:
# head.next = ListNode('Python')

# 增加第三个节点
nd.next = ListNode(0.618)

# 增加最后一个节点
nd.next.next = ListNode(False)

print(f'头节点的值{head.val}')
print(f'下一节点的值{head.next.val}')

# 如果节点的next属性指向None则说明这个节点就是末尾了
# 所以如下代码可以遍历整个链表
current = head  # 一定要赋值,不能直接对head操作,否则以后无法访问到链表中的数据了
n = 1  # 只是为了计数,演示用
while current is not None:
    print(f'第{n}个节点的值是{current.val}')
    n += 1
    current = current.next  # 这一行很重要,让current指向下一节点,没有这一行程序会陷入死循环

# 到达最后一个节点时current.next的值就是None
# 所以经过current = current.next这一样代码后current is not None这个条件不成立,循环自动退出。

以上就是关于链表的head、head.next、head.val的解释,如果还有问题请继续提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-16 08:46:46 | 显示全部楼层
hello? 发表于 2022-8-15 21:37
还是有点不理解,主要是没学过头节点什么的
head 是通过什么实例成ListNode的对象的?head:ListNode吗? ...

说来话长,如果想要学好的话,我建议先去学数据结构和算法,从里面能学到很多知识的
当然如果不会其他语言的话,可以先学python版本的
但是我还是建议学C或者C++版本的,因为设计的内存操作,学C或者C++更加容易理解,等到时候在学到python的时候就会得心应手,而且写python版本的,还得去学面向对象
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-16 11:26:57 | 显示全部楼层
ZhKQYu 发表于 2022-8-16 08:46
说来话长,如果想要学好的话,我建议先去学数据结构和算法,从里面能学到很多知识的
当然如果不会其他语 ...

真巧,我昨天刚刚在b站学算法哈哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-16 12:58:23 | 显示全部楼层
hello? 发表于 2022-8-16 11:26
真巧,我昨天刚刚在b站学算法哈哈

加油,道阻且长,行则将至;行而不辍,未来可期
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-16 19:11:00 | 显示全部楼层
ZhKQYu 发表于 2022-8-16 12:58
加油,道阻且长,行则将至;行而不辍,未来可期

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-16 19:12:00 | 显示全部楼层
Brick_Porter 发表于 2022-8-16 07:47
可能你不太理解什么是链表,所以无法理解这里的head、head.next、head.val。

先来画一个草图让你理解什 ...

谢谢大佬帮助,很清楚详细,懂了懂了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-29 12:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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