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

示例 1:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路:

快慢指针,

记住快慢指针的灵魂,一个慢,一个快,这个时候就会产生差值,这个差值恰好会解决问题。

python3代码

# 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: ListNode{val: 1, next: ListNode{val: 2,
        #                        next: ListNode{val: 3,
        #                        next: ListNode{val: 4,
        #                        next: ListNode{val: 5,
        #                        next: None}}}}}
        # ListNode(0): ListNode{val: 0, next: None}

        # 快慢指针灵魂
        # 快指针先走n步, 慢指针在开始走,快指针结束,慢指针刚好和快指针差n步

        # 初始化快慢指针,为了让指针能够移动,要把指针放到链表上去
        # 快指针指向链表n的位置,慢指针也指向链表头
        oursstart = ListNode(0)
        oursstart.next = head

        slow_needle, fast_needle = oursstart, oursstart
        for _ in range(n):
            fast_needle = fast_needle.next

        # 快慢指针同时走,快指针走到最后会指向None,慢指针刚好和快指针差了n
        while fast_needle and fast_needle.next:
            slow_needle, fast_needle = slow_needle.next, fast_needle.next
        
        # 现在慢指针所在的位置节点删除,即把指向next的next
        slow_needle.next = slow_needle.next.next
        
        return oursstart.next

LeeCode 19.删除链表的倒数第N个结点插图

TODO: 这个时间应该可以优化,想办法

作者 admin

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注