题解 | #删除链表的倒数第n个节点#
删除链表的倒数第n个节点
https://www.nowcoder.com/practice/f95dcdafbde44b22a6d741baf71653f6
# class ListNode: # def __init__(self, x): # self.val = x # self.next = None # # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # # @param head ListNode类 # @param n int整型 # @return ListNode类 #
方法一
获取链表长度。
- 时间复杂度为O(N);
- 空间复杂度为O(1)。
class Solution:
def removeNthFromEnd(self , head: ListNode, n: int) -> ListNode:
length = 0
p = head
# 获取长度
while p:
length += 1
p = p.next
res = ListNode(-1) # 便于删除第一个元素
res.next = head
pre = res
cur = head
for i in range(length-n):
pre = cur
cur = cur.next
pre.next = cur.next # 删除元素
return res.next
方法二
快慢指针。快指针先走n步,再快慢指针同时走,并且加一个前序指针指向慢指针的前一个节点。当快指针到了尾端的时候,此时慢指针到了目标节点,则将前序节点的next指向slow节点的next值。
- 时间复杂度为O(N);
- 空间复杂度为O(1)。
class Solution:
def removeNthFromEnd(self , head: ListNode, n: int) -> ListNode:
slow = head
fast = head
res = ListNode(-1)
res.next = head
for i in range(n):
fast = fast.next
pre = res
while fast:
pre = slow
fast = fast.next
slow = slow.next
pre.next = slow.next
return res.next

凡岛公司福利 613人发布