链表删除节点是一道经典的面试题,
主要解体的思路为双指针,
指针a先运动n次next,
然后b指针和a指针一起运动,直到到达tail
这里主要需要关注几点到corner case:
- 如果链表为空
- 如果删除的是第一个节点
- 如果只有一个节点
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution(object):
def removeNthFromEnd(self, head, n):
"""
:type head: ListNode
:type n: int
:rtype: ListNode
"""
# 为空
if not head:
return
# 只有一个节点
if not head.next:
return
del_pre = head
for i in range(n):
del_pre = del_pre.next
# 如果删除的是第一个节点
if not del_pre:
head = head.next
return head
pre = head
while del_pre and del_pre.next:
pre = pre.next
del_pre = del_pre.next
last = pre.next.next
pre.next = last
return head