kking1 发表于 2022-8-12 10:22:54

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

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

qq1151985918 发表于 2022-8-12 11:48:01

一个pop全解决了

kking1 发表于 2022-8-12 18:44:27

qq1151985918 发表于 2022-8-12 11:48
一个pop全解决了

求示范代码

qq1151985918 发表于 2022-8-12 18:47:50

kking1 发表于 2022-8-12 18:44
求示范代码

>>> a = list(range(10))
>>> a

>>> a.pop(-1)
9
>>> a

>>> a.pop(-2)
7
>>> a

>>> a.pop(-3)
5
>>> a

>>>

kking1 发表于 2022-8-12 18:55:21

qq1151985918 发表于 2022-8-12 18:47


这个不是链表把?

ZhKQYu 发表于 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

kking1 发表于 2022-8-13 11:53:10

ZhKQYu 发表于 2022-8-12 19:03


这个代码怎么测试呢?像示例三那样

kking1 发表于 2022-8-13 12:22:52

ZhKQYu 发表于 2022-8-12 19:03


也就是怎么输入head=,n=1来执行代码,这个我现在不会

ZhKQYu 发表于 2022-8-13 12:38:37

kking1 发表于 2022-8-13 12:22
也就是怎么输入head=,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()

稍微写了一下实现链表,然后把那个删除倒数第几个的代码修改了一下
链表的逻辑基本就是这样的

ZhKQYu 发表于 2022-8-13 12:43:59

kking1 发表于 2022-8-13 12:22
也就是怎么输入head=,n=1来执行代码,这个我现在不会

你这样不就是个列表吗,不需要用到自定义链表吧,只是实现一个简单的数据存取,直接pop即可

kking1 发表于 2022-8-13 13:19:56

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

我看那个示例就是这样写的

ZhKQYu 发表于 2022-8-13 13:24:58

kking1 发表于 2022-8-13 13:19
我看那个示例就是这样写的

有更详细的题目要求吗,或者别人给了别的什么提示,我瞅瞅

kking1 发表于 2022-8-13 16:14:07

ZhKQYu 发表于 2022-8-13 13:24
有更详细的题目要求吗,或者别人给了别的什么提示,我瞅瞅

https://leetcode.cn/problems/remove-nth-node-from-end-of-list/

ZhKQYu 发表于 2022-8-13 16:32:51

kking1 发表于 2022-8-13 16:14
https://leetcode.cn/problems/remove-nth-node-from-end-of-list/

https://s1.328888.xyz/2022/08/13/T3upB.png
直接赋值上面的代码提交即可,测试可以通过的
就是下面这段代码
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

ZhKQYu 发表于 2022-8-13 16:35:11

ZhKQYu 发表于 2022-8-13 16:32
直接赋值上面的代码提交即可,测试可以通过的
就是下面这段代码

上面的链接掉了,重新上传了一个
https://s3.bmp.ovh/imgs/2022/08/13/bf1e9d6f60821390.png

kking1 发表于 2022-8-13 16:44:18

ZhKQYu 发表于 2022-8-13 16:35
上面的链接掉了,重新上传了一个

en,但是我因为没有输入,所以我在vscode上就不能看到输出结果

kking1 发表于 2022-8-13 16:48:30

ZhKQYu 发表于 2022-8-13 16:35
上面的链接掉了,重新上传了一个

我习惯在力扣上找题,然后在vscode上实现出来,并输入示例得到相应结果

ZhKQYu 发表于 2022-8-13 16:52:35

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

那就得自己去实现链表的细节,我上面的代码就是基本的一个逻辑,只是采用尾插法,你改成头插法,然后自己实现一个输入即可

ZhKQYu 发表于 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()
大概就是这样实现

kking1 发表于 2022-8-13 17:00:41

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

https://sm.ms/image/YxlUfVBH8GrEy53,这里面最后那行代码,如果是头结点指向新节点不应该是self.head.next = node吗?
页: [1] 2
查看完整版本: 求问这个题可测试的代码应该怎么修改,如示例三这个例子的测试代码