1. 程式人生 > >LeetCode 206. Reverse Linked List (反轉連結串列)

LeetCode 206. Reverse Linked List (反轉連結串列)

原題

Reverse a singly linked list.

Example:

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

Follow up:

A linked list can be reversed either iteratively or recursively. Could you implement both?

Reference Answer

思路分析

解題方法有很多種:

  1. 藉助python list,儲存每個節點,再反向遍歷,重新連結即可。(時間複雜度 O(n),空間複雜度 O(n))
  2. 進一步優化,直接在進行遍歷的時候,儲存當前節點,進行反向連結即可,具體看參考程式碼(此時,時間複雜度O(n),空間複雜度O(1))

Code One
時間複雜度 O(n),空間複雜度 O(n)

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def reverseList(self,
head): """ :type head: ListNode :rtype: ListNode """ if not head or not head.next: return head temp_list = [] while head: end = head temp_list.append(head) head = head.next root = end for
index in range(len(temp_list)-2, -1, -1): end.next = temp_list[index] end = end.next end.next = None return root

Code Two
時間複雜度 O(n),空間複雜度 O(1)

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def reverseList(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        if not head or not head.next:
            return head
        
        real_end = end = head
        # end.next = None
        head = head.next
        while head:
            temp = head
            head = head.next
            temp.next = end
            end = temp
        real_end.next = None
        return end    
        

Note:

  • 注意方法二中,最終要設定 real_end.next = None