鱼C论坛

 找回密码
 立即注册
查看: 3050|回复: 28

[已解决]求问这个题可测试的代码应该怎么修改,如示例三这个例子的测试代码

[复制链接]
发表于 2022-8-12 10:22:54 | 显示全部楼层 |阅读模式

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

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

x
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

def removeNthFromEnd(head: ListNode, n: int) -> ListNode:
    def getLength(head: ListNode) -> int:
        length = 0
        while head:
            length += 1
            head = head.next
        return length
   
    dummy = ListNode(0, head)
    length = getLength(head)
    cur = dummy
    for i in range(1, length - n + 1):
        cur = cur.next
    cur.next = cur.next.next
    return dummy.next
最佳答案
2022-8-14 16:57:10

第一张图片是链表为空的时候add进行的操作

                               
登录/注册后可看大图

第二张图片是链表不为空的时候add进行的操作

                               
登录/注册后可看大图

如果不是self.head = node而是self.head.next=node的话,就会抛出异常,如果是是空链表的话,就会出现你去访问None的next指针的异常,显然会出现错误;如果不是空链表的话,就会出现head当前指针指向的节点的next又指向第一个节点,而此刻第一个节点又指向了当前的head指向的节点,造成了循环链表,显然与题目不符,并且这样做并不会修改head指向的位置,显然我们是要修改head指向的位置
QQ截图20220812101924.png
QQ截图20220812102200.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-12 11:48:01 From FishC Mobile | 显示全部楼层
一个pop全解决了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-12 18:44:27 | 显示全部楼层

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

使用道具 举报

发表于 2022-8-12 18:47:50 | 显示全部楼层
>>> a = list(range(10))
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> a.pop(-1)
9
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8]
>>> a.pop(-2)
7
>>> a
[0, 1, 2, 3, 4, 5, 6, 8]
>>> a.pop(-3)
5
>>> a
[0, 1, 2, 3, 4, 6, 8]
>>> 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-12 18:55:21 | 显示全部楼层

这个不是链表把?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-12 19:03:10 | 显示全部楼层
# 链表
class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

# 删除倒数第n个节点,并返回头节点
def removeNthFromEnd(head, n):
    # 创建一个新的链表,用来存储链表的值
    new_head = ListNode(0)
    new_head.next = head
    # 创建两个指针,一个指向新的链表的头节点,一个指向新的链表的尾节点
    p1 = new_head
    p2 = new_head
    # 先将p2向后移动n个节点
    for i in range(n):
        p2 = p2.next
    # 当p2为None时,说明p2已经到达链表的尾部,此时p1指向的是倒数第n个节点
    while p2:
        p1 = p1.next
        p2 = p2.next
    # 删除p1指向的节点
    p1.next = p1.next.next
    return new_head.next
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-13 11:53:10 | 显示全部楼层

这个代码怎么测试呢?像示例三那样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-13 12:22:52 | 显示全部楼层

也就是怎么输入head=[1,2],n=1来执行代码,这个我现在不会
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-13 12:38:37 | 显示全部楼层
kking1 发表于 2022-8-13 12:22
也就是怎么输入head=[1,2],n=1来执行代码,这个我现在不会
# 节点
class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

# 链表
class LinkList:
    # 初始化一个链表时,head指向空
    def __init__(self):
        self.head = None

    # 采用头插法
    def add(self, x):
        node = ListNode(x) # 创建一个新节点
        node.next = self.head # 新节点指向头节点
        self.head = node # 头节点指向新节点
    
    # 显示链表
    def show(self):
        p = self.head
        while p:
            print(p.val, end=' ')
            p = p.next
        print()
    
    # 删除倒数第n个节点
    def removeNthFromEnd(self, n):
        return removeNthFromEnd(self.head, n)

# 删除倒数第n个节点,并返回头节点
def removeNthFromEnd(head, n):
    # 创建一个新的节点
    new_head = ListNode(0)
    new_head.next = head
    # 创建两个指针,一个指向新的链表的头节点,一个指向新的链表的尾节点
    p1 = new_head
    p2 = new_head
    # 先将p2向后移动n个节点
    for i in range(n):
        p2 = p2.next

    # print(p2.val)
    # 当p2为None时,说明p2已经到达链表的尾部,此时p1指向的是倒数第n个节点
    while p2.next:
        p1 = p1.next
        p2 = p2.next
    # 删除p1指向的节点
    p1.next = p1.next.next
    return new_head.next

if __name__ == '__main__':
    l = LinkList()
    l.add(1)
    l.add(2)
    l.add(3)
    l.add(4)
    l.add(5)
    l.show()
    l.removeNthFromEnd(3)
    l.show()

稍微写了一下实现链表,然后把那个删除倒数第几个的代码修改了一下
链表的逻辑基本就是这样的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-13 12:43:59 | 显示全部楼层
kking1 发表于 2022-8-13 12:22
也就是怎么输入head=[1,2],n=1来执行代码,这个我现在不会

你这样不就是个列表吗,不需要用到自定义链表吧,只是实现一个简单的数据存取,直接pop即可
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-13 13:19:56 | 显示全部楼层
ZhKQYu 发表于 2022-8-13 12:43
你这样不就是个列表吗,不需要用到自定义链表吧,只是实现一个简单的数据存取,直接pop即可

我看那个示例就是这样写的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-13 13:24:58 | 显示全部楼层
kking1 发表于 2022-8-13 13:19
我看那个示例就是这样写的

有更详细的题目要求吗,或者别人给了别的什么提示,我瞅瞅
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-13 16:14:07 | 显示全部楼层
ZhKQYu 发表于 2022-8-13 13:24
有更详细的题目要求吗,或者别人给了别的什么提示,我瞅瞅

https://leetcode.cn/problems/remove-nth-node-from-end-of-list/
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-13 16:32:51 | 显示全部楼层
kking1 发表于 2022-8-13 16:14
https://leetcode.cn/problems/remove-nth-node-from-end-of-list/


                               
登录/注册后可看大图

直接赋值上面的代码提交即可,测试可以通过的
就是下面这段代码
def removeNthFromEnd(head, n):
    # 创建一个新的节点
    new_head = ListNode(0)
    new_head.next = head
    # 创建两个指针,一个指向新的链表的头节点,一个指向新的链表的尾节点
    p1 = new_head
    p2 = new_head
    # 先将p2向后移动n个节点
    for i in range(n):
        p2 = p2.next

    # print(p2.val)
    # 当p2为None时,说明p2已经到达链表的尾部,此时p1指向的是倒数第n个节点
    while p2.next:
        p1 = p1.next
        p2 = p2.next
    # 删除p1指向的节点
    p1.next = p1.next.next
    return new_head.next
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-13 16:35:11 | 显示全部楼层
ZhKQYu 发表于 2022-8-13 16:32
直接赋值上面的代码提交即可,测试可以通过的
就是下面这段代码

上面的链接掉了,重新上传了一个

                               
登录/注册后可看大图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-13 16:44:18 | 显示全部楼层
ZhKQYu 发表于 2022-8-13 16:35
上面的链接掉了,重新上传了一个

en,但是我因为没有输入,所以我在vscode上就不能看到输出结果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-13 16:48:30 | 显示全部楼层
ZhKQYu 发表于 2022-8-13 16:35
上面的链接掉了,重新上传了一个

我习惯在力扣上找题,然后在vscode上实现出来,并输入示例得到相应结果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-13 16:52:35 | 显示全部楼层
kking1 发表于 2022-8-13 16:48
我习惯在力扣上找题,然后在vscode上实现出来,并输入示例得到相应结果

那就得自己去实现链表的细节,我上面的代码就是基本的一个逻辑,只是采用尾插法,你改成头插法,然后自己实现一个输入即可
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-13 16:56:23 | 显示全部楼层
kking1 发表于 2022-8-13 16:48
我习惯在力扣上找题,然后在vscode上实现出来,并输入示例得到相应结果
if __name__ == '__main__':
    # l = LinkList()
    # l.add(1)
    # l.add(2)
    # l.add(3)
    # l.add(4)
    # l.add(5)
    # l.show()
    # l.removeNthFromEnd(3)
    # l.show()
    temp_node = eval(input("请输入链表,格式为列表形式:"))
    temp_n = eval(input("请输入倒数第n个节点:"))
    l = LinkList()
    for i in temp_node:
        l.add(i)
    print("原链表:", end="")
    l.show()
    l.removeNthFromEnd(temp_n)
    print("删除倒数第{}个节点后的链表:".format(temp_n), end="")
    l.show()
大概就是这样实现
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-13 17:00:41 | 显示全部楼层
ZhKQYu 发表于 2022-8-13 12:38
稍微写了一下实现链表,然后把那个删除倒数第几个的代码修改了一下
链表的逻辑基本就是这样的


                               
登录/注册后可看大图
,这里面最后那行代码,如果是头结点指向新节点不应该是self.head.next = node吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-17 02:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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