Leetcode刷题记录(11):19删除链表的倒数第N个结点

刷题网站:Leetcode

难度: 中等

语言: Python

计划:从简单——>到中等——>再到难。

一、19删除链表的倒数第N个结点

1.1 题目描述

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

在这里插入图片描述

  • 示例1
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
  • 示例2
输入:head = [1], n = 1
输出:[]
  • 示例3
输入:head = [1,2], n = 1
输出:[1]

1.2 思考分析

(此题自身不是很懂,读了题解答案才清楚一些!)

一般要找链表的特殊位置,首先考虑使用快慢指针方法,并找到它的前驱。此题说删除倒数第n个节点,其实也可以理解为删除第L-N+1个节点。

一定要链表是一个指向下一个的方式,需要删除某个节点,则需找到它的前驱节点。但是,当链表长度为1,即只有头节点时,它没有前驱,容易发生错误,通常是在头节点前添加一个哑节点(dummy node),它的next指针指向链表的头节点。即不用对头节点进行特殊判断,否则需要判断边界条件。

head_dumy = ListNode()  #添加哑节点
head_dumy.next = head   #哑节点指向头节点 
slow, fast = head_dummy, head_dummy  ##快慢指针指向哑节点

代码思想:让快指针前进n步,然后快慢指针一起前进,直至快指针指向Null,则此时的慢指针指向的节点就是要删除的节点,但还需知道删除节点的前驱节点以便进行删除。

快指针前进n步

while(n!=0): #fast先往前走n步
            fast = fast.next
            n -= 1

然后,快慢指针同时走,直至快指针走到最后

while(fast.next!=None):
            slow = slow.next
            fast = fast.next

然后,删除慢指针的后驱节点(也就是让它指向后驱的后驱节点)

slow.next = slow.next.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: ListNode, n: int) -> ListNode:
        head_dummy = ListNode()
        head_dummy.next = head

        slow, fast = head_dummy, head_dummy
        while(n!=0): #fast先往前走n步
            fast = fast.next
            n -= 1
        while(fast.next!=None):
            slow = slow.next
            fast = fast.next
        #fast 走到结尾后,slow的下一个节点为倒数第N个节点
        slow.next = slow.next.next #删除
        return head_dummy.next

1.3 总结

此题的重点是理解什么是链表?它不同于列表,不能直接得出长度,它是每个节点指向下一个节点的存储方式。另外还有一个概念是哑节点指向头节点。删除某个节点的方式,就是让它所指向的节点跳过它就行。

猜你喜欢

转载自blog.csdn.net/A33280000f/article/details/121307335