LeetCode-19.删除链表倒数第n个结点

题目要求对链表只使用一遍扫描,因此采用双指针的方式来实现,具体思路如下:

(1)定义一个虚拟头结点指向原链表头部

(2)定义两个移动指针指向链表的头结点

(3)遍历链表,只移动尾指针,当尾指针与头指针相隔n个结点时再同步移动头、尾指针

(4)当尾指针到达链表末尾时,此时头指针指向的便是要删除结点的前一个结点,删除目标结点后,返回虚拟头结点

(5)考虑删除的结点是头结点的情况

具体代码如下:

class Solution(object):
    def removeNthFromEnd(self, head, n):
        """
        :type head: ListNode
        :type n: int
        :rtype: ListNode
        """
        h = head
        p = h
        q = h
        n = n+1
        while p != None:
            p = p.next
            if n:
                n -= 1 #通过n来判断p、q指针是否相隔n个结点
            else:
                q = q.next

        if n:    #若n大于0则表示删除的是头结点
            h = q.next
        else:
            q.next = q.next.next


        return h
                

               

你可能感兴趣的:(链表,leetcode,数据结构,算法,python)