Remove Nth Node From End of List

题目的要求是尽量One pass解决,首先想到的方法还是利用stack收入所有点后反向弹出来,这样不能算one pass,也算是一种方法吧,下面是代码,链表型题就是注意空节点问题就好了

class Solution(object):
    def removeNthFromEnd(self, head, n):
        """
        :type head: ListNode
        :type n: int
        :rtype: ListNode
        """
        stack = []
        cur = head
        while cur:
            stack.append(cur)
            cur = cur.next

        count = 0
        remove_node = None
        while count < n:
            remove_node = stack.pop()
            count += 1

        if remove_node == head:
            return head.next
        else:
            stack[-1].next = remove_node.next
            remove_node.next = None
            return head

下面是one pass的方法,利用的就是链表里常用的快慢指针技巧,即令快指针先往前挪n位再同时移动快慢指针知道快指针到头,这时慢指针就在需要删除的结点前一位,删除即可,另外这里注意一下dummy node的创建还有快慢指针的初始化以及快指针应该移动的位数

class Solution(object):
    def removeNthFromEnd(self, head, n):
        """
        :type head: ListNode
        :type n: int
        :rtype: ListNode
        """
        dummy = ListNode('dmu')
        dummy.next = head
        slow, fast = dummy, head

        for i in xrange(n):
            fast = fast.next

        while fast:
            fast = fast.next
            slow = slow.next

        tmp = slow.next
        slow.next = tmp.next
        tmp.next = None
        return dummy.next

results matching ""

    No results matching ""