刷題系列 - 用遞迴和遍歷兩個方法反轉一個單鏈佇列

張國平發表於2020-02-18

二叉樹的題目告一段落,後面陸續做了些基礎的題;感覺沒有什麼好記錄的。

這次是一個非常基礎題目用遞迴和遍歷兩個方法反轉一個單鏈佇列。如下所示。

Input: 1->2->3->4->5->NULL
Output: 5->4->3->2->1->NULL


遞迴的方法,考慮了下其實方法很多,我想了比較簡單的,就是取出第一個節點,放在後續節佇列的最後,如此迴圈遞迴直到只有一個節點位置。程式碼是很好寫,就是效率太低,提交執行時間1008ms,實在是,主要每次一個節點排序,都要遍歷整條佇列,其實應該有更好的。

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
 
class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        if head == None or head.next == None:
            return head
        node = self.reverseList(head.next)
        head.next = None
        checknode = node
        while checknode.next != None:
            checknode = checknode.next
        checknode.next = head
        return node


遍歷方法也很簡單,就是新建一個佇列做棧,把單鏈佇列的按照順序放入,然後反向推出節點,重組佇列返回即可。提交執行時間34ms, 效率高很多。

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
 
class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        if head == None:
            return head
        nodeStack = []
        while head != None:
            nodeStack.append(head)
            head = head.next
        print(len(nodeStack))
        newHead = nodeStack.pop()
        point = newHead
        while nodeStack != []:
            point.next = nodeStack.pop()
            point = point.next
        point.next = None
        return newHead


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22259926/viewspace-2676131/,如需轉載,請註明出處,否則將追究法律責任。

相關文章