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

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

昨天,從澳洲回來放暑假的好哥們來這兒找我了,真的是把大半個學校走遍了,晚上Jio酸的不行。不過他帶來的巧克力是真的好吃,是不是國外的巧克力都好吃啊!最後再吐槽一下,

昨天晚上一屁股把我的公交卡給碾成了兩節,陪伴了我四年的公交卡啊!你命不該絕,怪就怪你的主人長了塊大屁股


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

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

示例:

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

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

說明:

給定的 n 保證是有效的。

思路

我們注意到這個問題可以容易地簡化成另一個問題:刪除從列表開頭數起的第 (L - n + 1)(Ln+1) 個結點,其中 LL 是列表的長度。只要我們找到列表的長度 LL,這個問題就很容易解決。

程式碼如下:

class Solution:
    def removeNthFromEnd(self, head, n):
        """
        :type head: ListNode
        :type n: int
        :rtype: ListNode
        """
        length = self.getLength(head)
        if n > length:
            return
        dump = ListNode(0)
        dump.next = head
        dump_copy = dump
        delete_index = length - n
        while delete_index > 0:
            delete_index -= 1
            dump_copy = dump_copy.next
        dump_copy.next = dump_copy.next.next
        return dump.next

    # 獲取head指標的長度
    def getLength(self, head):
        length = 0
        head_copy = head
        while head_copy:
            length += 1
            head_copy = head_copy.next
        return length


if __name__ == '__main__':
    list_node = [1, 2, 3, 4, 5]
    l1 = ListNode(0)
    cur_l1 = l1
    for index in range(len(list_node)):
        cur_l1.next = ListNode(list_node[index])
        cur_l1 = cur_l1.next
    n = 2
    result = Solution().removeNthFromEnd(l1.next, n)
    while result:
        print(result.val)
        result = result.next

執行效率一般般,在30%左右

 

這兩天做到後面的23題——合併k個有序連結串列時(不小心暴露了進度)受到了一些啟發,其實我們可以用一個數組把連結串列中每個節點的值給儲存起來,連結串列的pop()方法很容易刪除倒數第N個節點的值,最後再用個連結串列把處理過的陣列中的值導進來就行了,是不是覺得很有意思!

程式碼如下:

class Solution:
    def removeNthFromEnd(self, head, n):
        """
        :type head: ListNode
        :type n: int
        :rtype: ListNode
        """
        head_list = []
        head_copy = head
        while head_copy:
            head_list.append(head_copy.val)
            head_copy = head_copy.next
        if len(head_list) < n:
            return
        head_list.pop(len(head_list)-n)
        Head = ListNode(0)
        head_copy = Head
        for index in head_list:
            head_copy.next = ListNode(index)
            head_copy = head_copy.next
        return Head.next


if __name__ == '__main__':
    list_node = [1, 2, 3, 4, 5]
    l1 = ListNode(0)
    cur_l1 = l1
    for index in range(len(list_node)):
        cur_l1.next = ListNode(list_node[index])
        cur_l1 = cur_l1.next
    n = 2
    result = Solution().removeNthFromEnd(l1.next, n)
    while result:
        print(result.val)
        result = result.next

執行效率是不錯的,我測得幾次都在52s