力扣热题100之删除链表的倒数第N个节点

题目

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

在这里插入图片描述

代码

方法一

将链表中的值放入列表中,然后删除倒数第n个值,再将剩下的数依次转化为链表

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
        head_list=[]
        while head:
            head_list.append(head.val)
            head=head.next
        head_list.pop(-n)
        if not head_list:
            return None
        res=ListNode(head_list[0])
        cur=res
        for num in head_list[1:]:
            cur_node=ListNode(num)
            cur.next=cur_node
            cur=cur.next
        return res

方法二:

将构造一个新链表,计算链表长度通过遍历找到需要删除的节点的前驱节点。

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
        def getlength(head:ListNode)->int:
            length=0
            while head:
                length+=1
                head=head.next
            return length
        
        dummy= ListNode(0,head)#在head头节点前面添加一个值为0的节点
        length=getlength(head)
        cur=dummy
        for i in range(1,length-n+1):
            cur =cur.next
        cur.next=cur.next.next
        return dummy.next

方法三:

使用栈的思想找到需要删除的节点的前驱节点,然后使用和方法二相同的方法实现删除节点。

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:

        dummy= ListNode(0,head)#在head头节点前面添加一个值为0的节点
        stack=[]
        cur=dummy
        while cur:
            stack.append(cur)
            cur = cur.next
        for i in range(n):
            stack.pop()
        prev=stack[-1]#就是为了找到被删除节点的前驱节点
        prev.next=prev.next.next
        return dummy.next
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值