【每日一题】19. Remove Nth Node From End of List

在这里插入图片描述

题目意思是说,只允许遍历一次,删除链表当中倒数第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

猜你喜欢

转载自blog.csdn.net/SJTUKK/article/details/109141830