剑指 Offer II 021. 删除链表的倒数第 n 个结点(中等-双指针)

剑指 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

路虽远,行则将至。事虽难,做则必成 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值