【删除链表的倒数第N个节点】python刷题记录

目录

哑结点

为什么设置哑节点?

方法1(先遍历统计长度,再查找具体位置):

方法2(双指针):

链表基本用法

哑结点

在链表前面添加哑节点,指向头节点

为什么设置哑节点?

正常来说题目分为2种情况:

  • 一般情况:上一个结点的next指向下一个节点即可
  • node.next=node.next.next
  • 当要删结点是头节点的时候
  • head=head.next

当然,可以分类来做

也可以采用哑结点避免讨论。

方法1(先遍历统计长度,再查找具体位置):

# 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)
        #这里计算链表长度不能放在哑节点创建前面
        length = 0
        while head:
            length += 1
            head = head.next
        #cur是一个遍历的指针
        cur = dummy
        #length-n次
        for i in range(length - n):
            cur = cur.next
        cur.next = cur.next.next
        return dummy.next

方法2(双指针):

 不需统计链表长度

one,two两个指针,同时从头结点出发

one先跑n格,再同时一起跑,one到达终点(即one.next=NULL)时,two.next就是要删除的结点

                                                   (该图用fist,second演示,都一样)

# 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)
        one=head
        two=dummy
        #one先跑
        for i in range(n):
            one=one.next
        #one,two一起跑,直到one为空
        while one:
            one=one.next
            two=two.next
        #two的下一个就是要删的
        two.next=two.next.next
        return dummy.next

感谢carl神 

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值