题目意思是说,只允许遍历一次,删除链表当中倒数第n结点,按题目意思来看,应该是从1开始计数的。
使用双指针法,准确而言,它并不是严格的遍历一次,毕竟第二个指针也会走一定的距离。
算法思想是,设置两个指针,先让第一个指针走n步,然后两个指针一起走,最后第二个指针所指向的位置就是要删除结点的上一个结点。这里有一个特殊的情况需要考虑,也是我第一次写没注意到的地方,如果当n等于链表的长度的时候,第一个指针走n步就会走到尾部结点后面的空指针处,在while(p.next)的时候会报错,原因是空指针是没有next的属性的。如果n小于链表的长度的时候,那么我们就让两个指针一起走,一直走到链表的末尾
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
p = head
q = head
for i in range(0, n):
p = p.next
if not p:
return head.next #当n等于链表长度的时候,p为空,直接返回head.next
while(p.next):
p = p.next
q = q.next
q.next = q.next.next
return head