剑指 Offer II 021. 删除链表的倒数第 n 个结点
给定一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
'''
题目:给定一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
分析:双指针
如果 k = 3 则删除5 得到倒数第k个元素的前一个为 p1 指向最后一个元素为p2 则 p1 p2相差 k 步,则可删除
倒数 7 6 5 4 3 2 1
下标 0 1 2 3 4 5 6
值 1 2 3 4 5 6 7
p1 p2
如何得到 p1呢? 可以让p1 p2同时指向头指针,然后p2向后移动k步,然后再同步前进直到p2的next为空
但是要注意一些特殊情况:
① 如果head本身为空 则返回空
② 如果删除的是一个元素 则要求出头指针前边的指针 所以这时候头部之前要添加一个指针
-1 1 2 3
p1 p2
复杂度: 时间复杂度 O(max(k,n-k)) 空间复杂度 O(1)
'''
class LinkNode:
def __init__(self, val):
self.val = val
self.next = None
def create(nums):
head = LinkNode(nums[0])
cur = head
for i in range(1, len(nums)):
cur.next = LinkNode(nums[i])
cur = cur.next
return head
def delLastK(head, k):
# 如果head为空
if not head:
return head
# 如果 head 只有一个元素 k=1 则找到第一个元素前边的指针比较困难 所以可以增加一个头部的指针
tempHead = LinkNode(0)
tempHead.next = head
p1, p2 = tempHead, tempHead
for _ in range(k):
p2 = p2.next
while p2.next:
p1 = p1.next
p2 = p2.next
p1.next = p1.next.next
return tempHead.next