LeetCode题解(python)
19. 删除链表的倒数第N个节点
题目描述
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
解题心得
两种方法:
- 两遍扫描实现,第一遍扫描,求出链表长度,进而得到需要删除的结点的位置(count-n)第二遍扫描,到达删除的结点的前一个,使用指针跳跃到下一个即可。
- 时间复杂度 O ( n 2 ) O(n^2) O(n2)
- 一遍扫描实现,定义两个指针。第一个指针先往后走n步,然后两个指针继续一起往后走,直到第一个指针到达末尾,这时,第二个指针到达了需要删除的结点,删除即可。
- 时间复杂度 O ( n ) O(n) O(n)
解题代码
- 两遍扫描实现
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
temp = head
count = 0
while temp!=None:
temp = temp.next
count = count+1
#print(count)
temp = head
if n>count:
return None
if count==1:
return []
fn = count-n-1
if fn<0:
return temp.next
for i in range(fn):
temp = temp.next
print(temp.val)
temp.next = temp.next.next
temp = head
return temp
- 一遍扫描实现
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
left = right = head
for i in range(n):
right = right.next
if right == None:
return head.next
right = right.next
while right!=None:
right = right.next
left = left.next
left.next = left.next.next
left = head
return left
print(left.val)