我得到了這個代碼,它應該提供一種演算法來搜索雙向鏈表中間的專案。代碼中可能存在一個或多個缺陷,導致代碼無法執行。如何實作此代碼以使其使用鏈表作業?代碼本身有什么問題?
node1 = self.head
node2 = self.tail
while node1 != node2:
node1 = node1.next
node2 = node2.previous
return node1.value
uj5u.com熱心網友回復:
問題是您在回圈內同時“步進”兩個節點。因此,您可能會錯過中間,因為它們可以在不被發現的情況下相互跳過。
您應該在每次回圈迭代中一次步進一個節點。解決方案可能是這樣的:
node1 = self.head
node2 = self.tail
step_node_1 = True
while node1 != node2:
if step_node_1:
node1 = node1.next
step_node_1 = False
else:
node2 = node2.previous
step_node_1 = True
return node1.value
uj5u.com熱心網友回復:
代碼本身有什么問題?
有這些問題:
這可能很明顯,但代碼必須放在函式中,否則
return會出現語法錯誤。此外,由于有對 的參考self,這表明 function 是鏈表類的方法。如果串列為空,則
node1和node2將是None。執行時node1.value,會出現例外。您需要正確處理空串列案例如果串列有偶數個節點(并且不為空),則
node1和node2將互相經過,并將繼續直到它們到達串列的另一端并成為None。然后將再次發生與上述相同的例外。您還可以通過檢查node1并且node2是(不是)鄰居來解決這個問題
這是代碼的更正和完成:
class Node:
def __init__(self, value, nxt=None):
self.value = value
self.next = nxt
self.previous = None
class LinkedList:
def __init__(self):
self.head = self.tail = None
def push_front(self, value):
self.head = Node(value, self.head)
if self.tail:
self.head.next.previous = self.head
else:
self.tail = self.head
def get_mid_value(self):
node1 = self.head
node2 = self.tail
while node1 != node2 and node1.next != node2: # Neighbor check
node1 = node1.next
node2 = node2.previous
if node1: # Guard
return node1.value
# Demo
lst = LinkedList()
lst.push_front(2)
lst.push_front(1)
print(lst.get_mid_value())
uj5u.com熱心網友回復:
如果串列為空self.head,self.tail則為None. 在最后一行你會return None.value導致錯誤。看看這個例子:串列有 4 個節點 n1、n2、n3、n4
回圈前
node1 = n1, node2 = n4
- 迭代
node1 = n2, node2 = n3
- 迭代
node1 = n3, node2 = n2
node1 和 node2 即使指向中間元素也不相同。回圈連續
- 迭代
node1 = n4, node2 = n1
- 迭代
node1 = None, node2 = None
最后 node1 和 node2 相同,因此回圈中斷。然后因為 node1 等于None return None.value將被呼叫,這會導致錯誤。您的代碼應如下所示:
node1 = self.head
node2 = self.tail
while node1 != node2 and node1.next != node2:
node1 = node1.next
node2 = node2.previous
if node1 != None: return node1.value
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/474783.html
