1. 程式人生 > >LeetCode19刪除連結串列的倒數第N個節點

LeetCode19刪除連結串列的倒數第N個節點

題目描述:

給定一個連結串列,刪除連結串列的倒數第 n 個節點,並且返回連結串列的頭結點。

示例:

給定一個連結串列: 1->2->3->4->5, 和 n = 2.

當刪除了倒數第二個節點後,連結串列變為 1->2->3->5.

說明:

給定的 n 保證是有效的。

解題思路:

大體想到了兩個思路:

  1. 先說暴力的方法。先遍歷一遍連結串列,可以得知總計有多少的節點。刪除倒數第n個,就等同於刪除正數第 l

    e n ( l ) n + 1
    len(l) - n + 1 個。遍歷兩次連結串列就肯定可以解決。函式複雜度也就是 O ( n ) O(n)

  2. 想用遍歷一次連結串列就實現該功能的話,就需要使用兩個指標。一個指標先行一步,當前一個指標走了n步之後,後一個指標再動身。這樣,等第一個指標走到最後的時候,後面的指標跳過其下一個節點,就表示刪除了該節點了。這個方法不難理解,關鍵就是需要能夠對連結串列及“指標”有著較好的理解,能夠處理好邊界條件。

程式碼實現:

Python3實現,Github: https://github.com/zhangdianlei/LeetCode_python/blob/master/src/c19.py

class Solution:
    def removeNthFromEnd(self, head, n):
        """
        :type head: ListNode
        :type n: int
        :rtype: ListNode
        """
        result = ListNode(0)
        first = result
        second = result
        result.next = head

        for i in range(n+1):
            first = first.next

        while first is not None:
            first = first.next
            second = second.next

        second.next = second.next.next

        return result.next