[英]while reversing the singly linked list using recursion why is the space complexity o(1) when we are using the stack space inside the memory
[英]Singly linked list is not reversing when using recursion
我在弄清楚缺少的內容時遇到了麻煩。 我已經在線瀏覽了其他解決方案,當我應用這些差異時,這些解決方案似乎無效。 我花了很多時間嘗試調試。 這是我的代碼:
def recurse_reverse(self, curr, level):
print('-' * level, 'curr:', curr.value, '| next:', curr.next.value if curr.next else curr.next)
if (not curr) or (not curr.next): # if there's 0 or 1 node
return curr
# p = self.recurse_reverse(curr.next, level + 1)
self.recurse_reverse(curr.next, level + 1)
print('-' * level, 'curr:', curr.value, '->', curr.next.value, '->',
curr.next.next.value if curr.next.next else curr.next.next)
curr.next.next = curr
# checking if pointer moved
print('-' * level, 'curr:', curr.value, '->', curr.next.value, '->',
curr.next.next.value if curr.next.next else curr.next.next)
# curr.next = None
# return p
我打電話時得到的輸出
my_list = SinglyLinkedList()
my_list.add_to_tail(1)
my_list.add_to_tail(2)
my_list.add_to_tail(3)
my_list.add_to_tail(4)
print(my_list._head.value) # 1
print(my_list._head.next.value) # 2
print(my_list._head.next.next.value) # 3
print(my_list._head.next.next.next.value) # 4
my_list.recurse_reverse(my_list._head, 1)
這是:
- curr: 1 | next: 2
-- curr: 2 | next: 3
--- curr: 3 | next: 4
---- curr: 4 | next: None
--- curr: 3 -> 4 -> None
--- curr: 3 -> 4 -> 3
-- curr: 2 -> 3 -> 4
-- curr: 2 -> 3 -> 2
- curr: 1 -> 2 -> 3
- curr: 1 -> 2 -> 1
因此,在每個級別進行打印,似乎指針都已正確移動。 但是,當我嘗試打印鏈表的頭部和尾部時,我分別調用recurse_reverse
,分別得到1和3。 但是,我期望的是4和1。
在我看到的許多解決方案中,代碼的最后一行是curr.next = None
,以刪除當前節點的next
指針,但是當在我的代碼中包含該指針時,我得到AttributeError: 'NoneType' object has no attribute 'value'
我也嘗試過設定
p = self.recurse_reverse(curr.next, level + 1)
然后在最后一行return p
,但這也不起作用。
這是我的實現:
class _LinkNode:
def __init__(self, value):
self.value = value
self.next = None
class SinglyLinkedList:
def __init__(self):
self._head = None
self._tail = None
self._length = 0
def add_to_tail(self, value):
"""
Add a new node to the tail of the linked list.
Parameters
----------
value : int, float, string, dict, list, etc.
"""
new_node = _LinkNode(value)
if self._head is None: # if linked list is empty
self._head = new_node
if self._tail: # if linked list has a tail, i.e. > 1 node
self._tail.next = new_node
self._tail = new_node # regardless of current length, update tail
self._length += 1
def recurse_reverse(self, curr, level):
# see above
您的代碼有兩個問題。 首先,如果列表包含多個元素,則不交換_head.next
,在recurse_reverse
之后,它仍將指向原始列表的第二個元素,因此反向列表的最后兩個元素形成一個循環。第二個問題是您不_tail
在代碼中的任何地方交換_head
和_tail
。
這是一種遞歸實現逆轉的方法:
@staticmethod
def reverse(prev, node):
# Recurse until end of the list
if node:
SinglyLinkedList.reverse(node, node.next)
node.next = prev
def recurse_reverse(self):
# Reverse nodes
SinglyLinkedList.reverse(None, self._head)
# Swap head & tail since they are reversed now
self._head, self._tail = self._tail, self._head
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.