19. 删除链表的倒数第 N 个结点

54 阅读1分钟

19. 删除链表的倒数第 N 个结点

给你一个链表,删除链表的倒数第 n **个结点,并且返回链表的头结点。

 

示例 1:

输入: head = [1,2,3,4,5], n = 2
输出: [1,2,3,5]

示例 2:

输入: head = [1], n = 1
输出: []

示例 3:

输入: head = [1,2], n = 1
输出: [1]

 

提示:

  • 链表中结点的数目为 sz
  • 1 <= sz <= 30
  • 0 <= Node.val <= 100
  • 1 <= n <= sz

 

进阶: 你能尝试使用一趟扫描实现吗?

代码

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
  1. 普通做法
def removeNthFromEnd(head, n):
    cnt = 0 # 总节点数
    cur = head
    while cur:
        cnt += 1
        cur = cur.next
    if cnt == 1 and n <= 1:
        #如果只有一个节点
        return None 
    
    prenum = cnt - n #删除节点的前一个节点
    
    #删除的是头
    if prenum == 0:
        head = head.next
        return head
        
    cnt = 0
    cur = head
    while cur:
        cnt += 1
        if cnt == prenum:
            break
        cur = cur.next
        
    cur.next = cur.next.next
    return head
  1. 快慢指针
def removeNthFromEnd( head, n):
    d = ListNode(next=head) # 哨兵节点next头结点,应对删除的是头结点的情况
    slow = d # 快慢指针一开始next都指向头节点
    fast = d
    for _ in range(n):
        fast= fast.next # 快指针先走n步
    # 这时快慢指针距离为n
    # 一起走,快慢指针间距离始终为n,直到快指针到尾部,这时慢指针正好到达倒数第n + 1个节点位置
    while fast.next:
        slow = slow.next
        fast = fast.next
    slow.next = slow.next.next
    return d.next