鱼C论坛

 找回密码
 立即注册
查看: 3536|回复: 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
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-8-12 11:48:01 From FishC Mobile | 显示全部楼层
一个pop全解决了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

求示范代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-12 18:47:50 | 显示全部楼层
  1. >>> a = list(range(10))
  2. >>> a
  3. [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
  4. >>> a.pop(-1)
  5. 9
  6. >>> a
  7. [0, 1, 2, 3, 4, 5, 6, 7, 8]
  8. >>> a.pop(-2)
  9. 7
  10. >>> a
  11. [0, 1, 2, 3, 4, 5, 6, 8]
  12. >>> a.pop(-3)
  13. 5
  14. >>> a
  15. [0, 1, 2, 3, 4, 6, 8]
  16. >>>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

这个不是链表把?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

  6. # 删除倒数第n个节点,并返回头节点
  7. def removeNthFromEnd(head, n):
  8.     # 创建一个新的链表,用来存储链表的值
  9.     new_head = ListNode(0)
  10.     new_head.next = head
  11.     # 创建两个指针,一个指向新的链表的头节点,一个指向新的链表的尾节点
  12.     p1 = new_head
  13.     p2 = new_head
  14.     # 先将p2向后移动n个节点
  15.     for i in range(n):
  16.         p2 = p2.next
  17.     # 当p2为None时,说明p2已经到达链表的尾部,此时p1指向的是倒数第n个节点
  18.     while p2:
  19.         p1 = p1.next
  20.         p2 = p2.next
  21.     # 删除p1指向的节点
  22.     p1.next = p1.next.next
  23.     return new_head.next
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

这个代码怎么测试呢?像示例三那样
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

也就是怎么输入head=[1,2],n=1来执行代码,这个我现在不会
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

  11.     # 采用头插法
  12.     def add(self, x):
  13.         node = ListNode(x) # 创建一个新节点
  14.         node.next = self.head # 新节点指向头节点
  15.         self.head = node # 头节点指向新节点
  16.    
  17.     # 显示链表
  18.     def show(self):
  19.         p = self.head
  20.         while p:
  21.             print(p.val, end=' ')
  22.             p = p.next
  23.         print()
  24.    
  25.     # 删除倒数第n个节点
  26.     def removeNthFromEnd(self, n):
  27.         return removeNthFromEnd(self.head, n)

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

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

  47. if __name__ == '__main__':
  48.     l = LinkList()
  49.     l.add(1)
  50.     l.add(2)
  51.     l.add(3)
  52.     l.add(4)
  53.     l.add(5)
  54.     l.show()
  55.     l.removeNthFromEnd(3)
  56.     l.show()
复制代码


稍微写了一下实现链表,然后把那个删除倒数第几个的代码修改了一下
链表的逻辑基本就是这样的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

你这样不就是个列表吗,不需要用到自定义链表吧,只是实现一个简单的数据存取,直接pop即可
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

我看那个示例就是这样写的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

有更详细的题目要求吗,或者别人给了别的什么提示,我瞅瞅
小甲鱼最新课程 -> https://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/
小甲鱼最新课程 -> https://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/


                               
登录/注册后可看大图

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

  11.     # print(p2.val)
  12.     # 当p2为None时,说明p2已经到达链表的尾部,此时p1指向的是倒数第n个节点
  13.     while p2.next:
  14.         p1 = p1.next
  15.         p2 = p2.next
  16.     # 删除p1指向的节点
  17.     p1.next = p1.next.next
  18.     return new_head.next
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

                               
登录/注册后可看大图
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

en,但是我因为没有输入,所以我在vscode上就不能看到输出结果
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

我习惯在力扣上找题,然后在vscode上实现出来,并输入示例得到相应结果
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

那就得自己去实现链表的细节,我上面的代码就是基本的一个逻辑,只是采用尾插法,你改成头插法,然后自己实现一个输入即可
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-13 16:56:23 | 显示全部楼层
kking1 发表于 2022-8-13 16:48
我习惯在力扣上找题,然后在vscode上实现出来,并输入示例得到相应结果
  1. if __name__ == '__main__':
  2.     # l = LinkList()
  3.     # l.add(1)
  4.     # l.add(2)
  5.     # l.add(3)
  6.     # l.add(4)
  7.     # l.add(5)
  8.     # l.show()
  9.     # l.removeNthFromEnd(3)
  10.     # l.show()
  11.     temp_node = eval(input("请输入链表,格式为列表形式:"))
  12.     temp_n = eval(input("请输入倒数第n个节点:"))
  13.     l = LinkList()
  14.     for i in temp_node:
  15.         l.add(i)
  16.     print("原链表:", end="")
  17.     l.show()
  18.     l.removeNthFromEnd(temp_n)
  19.     print("删除倒数第{}个节点后的链表:".format(temp_n), end="")
  20.     l.show()
复制代码

大概就是这样实现
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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


                               
登录/注册后可看大图
,这里面最后那行代码,如果是头结点指向新节点不应该是self.head.next = node吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-27 08:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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