原题链接: https://leetcode.com/problems/remove-nth-node-from-end-of-list/
删除链表倒数的第n个点。
我的思路:
比较简单粗暴,直接将链表反转,然后去掉整数第n个node,再将链表正过来。这个代码运行速度超过了63%的代码。
class Solution:
def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
head_reverse = self.reverse(head)
remove_n = self.remove_node(head_reverse, n)
reverse_back = self.reverse(remove_n)
return reverse_back
def reverse(self, head):
prev = None
cur = head
while cur:
next_ = cur.next
cur.next = prev
prev = cur
cur = next_
return prev
def remove_node(self, head, n):
prev = dummy_head = ListNode(0)
dummy_head.next = head
cur = head
n -= 1
while n != 0:
prev = cur
cur = cur.next
n -= 1
prev.next = cur.next
return dummy_head.next
答案里的写法,代码比较简洁,但是运行速度并没有提升;这个做法的巧妙之处在于用一个p点始终跟链表的最后一个点保持n+1的距离, 那么当第一个指针到达链表终点的时候,将p的下一个点更新为下下个点,就达到了删除倒数第n个点的目的。
class Solution:
def removeNthFromEnd(self, head, n):
size = 1
cur = p = head
while cur.next:
size += 1
cur = cur.next
if size > n + 1:
p = p.next
if size == n:
return head.next
else:
p.next = p.next.next
return head