Leetcode - 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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解1 2021/8/29 O(n)
# Definition for singly-linked list.
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def __repr__(self):
return '{}'.format(self.val) + (('->' + self.next.__repr__()) if self.next else '')
def removeNthFromEnd(head: ListNode, n: int) -> ListNode:
# 题目要求只遍历一遍,可以这样
# 比如,倒数第3个,用两个指针同时步进,等第2个指针到达尾部,要删的就是第1个指针所在的位置
# ↓ ↓
# 1 2 3 4 5 6 ...
# 为了操作方便,加个空的头,两个指针往前挪一格,这样好删
# ↓ ↓
# dummy 1 2 3 4 5 6 ...
dummy=ListNode(-1)
dummy.next=head
l=r=dummy
# 先假设题目给的都是合理的,看ac不ac
while n-1:
n-=1
r=r.next
while r.next.next:
l=l.next
r=r.next
# del
l.next=l.next.next
return dummy.next
if __name__ == '__main__':
head=ListNode(1,ListNode(2,ListNode(3,ListNode(4,ListNode(5,ListNode(6))))))
head=removeNthFromEnd(head,2)
print(head)
head=ListNode(1,ListNode(2,ListNode(3,ListNode(4,ListNode(5,ListNode(6))))))
head=removeNthFromEnd(head,1)
print(head)
head=ListNode(1,ListNode(2,ListNode(3,ListNode(4,ListNode(5,ListNode(6))))))
head=removeNthFromEnd(head,3)
print(head)
head=ListNode(1)
head=removeNthFromEnd(head,1)
print(head)
head=ListNode(1,ListNode(2))
head=removeNthFromEnd(head,1)
print(head)


浙公网安备 33010602011771号