给你一个链表,删除链表的倒数第 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
#最直观的思路
利用双指针法,直接在原链表上进行修改,既省时又省空间
首先添加虚假头指针
随后利用双指针,先让cur指针前进n个节点,
这样其和end节点之间变相差n个节点
然后让cur和end节点同时移动,直至cur节点为None,代表已经到了链表的末尾
同时,用pre来记录end节点的前节点,为了方便删除end节点
最后,直接将pre的下一节点指向end的下一节点即可
这样便达到了删除end节点的效果
class Solution:
def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
dummy = ListNode(-1, head)
cur = dummy
end = dummy
for _ in range(n):
cur = cur.next
while cur != None:
cur = cur.next
pre = end
end = end.next
pre.next = end.next
return dummy.next