给你一个链表,删除链表的倒数第 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

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