19. 删除链表的倒数第N个节点
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5
第一次提交:选择了一个较为稳妥的两次遍历,时间复杂度为O(n),空间复杂度为O(n)的做法,先遍历存储,再遍历输出
# 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:
Node_list = []
while(head):
Node_list.append(head)
head = head.next
if not Node_list :
return []
delete_index = len(Node_list) - n
node = Node_list[0]
for index,Node in enumerate(Node_list):
if index == delete_index == 0:
node = node.next
continue
pre = Node_list[index]
if index == len(Node_list) - 1:
pre.next = None
elif index == delete_index - 1:
pre.next = Node_list[index+2] if index+2 < len(Node_list) else None
else:
pre.next = Node_list[index+1]
return node
改进:
.使用快慢指针,快指针领先慢指针n个节点,这样在快指针到达链表末尾时,慢指针的当前值为应删除的节点
# 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:
fast = slow = head
while(n):
fast = fast.next
n -= 1
if not fast:
return head.next
while(fast.next):
fast,slow = fast.next,slow.next
slow.next = slow.next.next
return head
时间复杂度O(n),空间复杂度O(1)
执行用时:32 ms, 在所有 Python3 提交中击败了98.46%的用户