给你一个链表,删除链表的倒数第
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 <= 300 <= Node.val <= 1001 <= n <= sz
进阶: 你能尝试使用一趟扫描实现吗?
代码
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
- 普通做法
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
- 快慢指针
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