LeetCode19-刪除連結串列的倒數第N個節點
阿新 • • 發佈:2018-11-23
昨天,從澳洲回來放暑假的好哥們來這兒找我了,真的是把大半個學校走遍了,晚上Jio酸的不行。不過他帶來的巧克力是真的好吃,是不是國外的巧克力都好吃啊!最後再吐槽一下,
昨天晚上一屁股把我的公交卡給碾成了兩節,陪伴了我四年的公交卡啊!你命不該絕,怪就怪你的主人長了塊大屁股
19. 刪除連結串列的倒數第N個節點
給定一個連結串列,刪除連結串列的倒數第 n 個節點,並且返回連結串列的頭結點。
示例:
給定一個連結串列: 1->2->3->4->5, 和 n = 2. 當刪除了倒數第二個節點後,連結串列變為 1->2->3->5.
說明:
給定的 n 保證是有效的。
思路
我們注意到這個問題可以容易地簡化成另一個問題:刪除從列表開頭數起的第 (L - n + 1)(L−n+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