2017-01-15 28 views
-1

リンクリストをPythonで実装しました。要素を追加してリストを印刷します。 しかし、私は削除方法に問題があります。私は)(私のクラスの細胞である、ここでリストPython 3.リンクリストからアイテムを削除

から最後の項目を削除する:新しいCellを追加するための方法が良い作品

class LinkedList(): 
def __init__(self): 
    self.top = None 
    self.last = None 
    self.length = 0 

:ここ

class Cell(): 
def __init__(self, value = None, next = None): 
    self.value = value 
    self.next = next 

は私のクラスLinkedListの()です:

def add (self, value, position = None): 

    newCell = Cell(value, None) 
    self.length += 1 
    if position is None or position >= self.length: 
     if self.top == None: 
      self.last = self.top = Cell(value, None) 
     else: 
      self.last.next = self.last = Cell(value, None) 
    elif position == 1: 
     self.top = Cell (value, self.top) 
    elif position > 1: 
     afterMe = self.top 
     i = 1 
     for i in range(position-2): 
      afterMe = afterMe.next 
     newCell.next = afterMe.next 
     afterMe.next = newCell 

toStringメソッドは、()も良い作品:

def __str__(self): 

    linkedList = '' 
    cell = self.top 
    if self.top is None: 
     return 'Linked list is empty' 

    for i in range(self.length): 
     if cell == self.last: 
      linkedList += (str(cell.value)) 
     else: 
      linkedList += (str(cell.value)+ ', ') 

     cell = cell.next 
    return linkedList 

そしてここでは、エラーを作成し、私のdeleteメソッドです:私はきちんと最後のセルを削除するには、コードを変更する必要がありますか、答えてください

numbers = LinkedList() 
numbers.add(55) 
numbers.add(75) 
numbers.add(65) 
print(numbers) # 55, 75, 65 
numbers.add(3,2) 
numbers.add (40,3) 
print(numbers) # 55, 3, 40, 75, 65 
numbers.delete() 
print(numbers) # 55, 3, 40, 75 
numbers.delete(40) 
print(numbers) 

    ''' returns error: 
    Traceback (most recent call last): 
    File "C:/Users/demin.va/Documents/Dropbox/Programming/Алгоритмы/связные списки.py", line 105, in <module> 
    print(numbers) 
    File "C:/Users/demin.va/Documents/Dropbox/Programming/Алгоритмы/связные списки.py", line 72, in __str__ 
    linkedList += (str(cell.value)+ ', ') 
AttributeError: 'NoneType' object has no attribute 'value' 
    ''' 

:ここ

def delete(self, value = None): # want to delete last cell 
    if self.top == None: 
     return None 
    current = self.top 

    if value is None: 
     self.length -= 1 

     while (current.next != self.last): 
      current = current.next 

     self.last = current 
     current.next = None 

    else: 
     while (current.next.value != value): 
      current = current.next 
      if current == self.last: 
       print ('no such value') 
       return 
     current.next = current.next.next 

どのようにコードの動作とエラーになりますまたは異なる位置からですか?

答えて

0

、ここにあなたがそれを行うだろう方法は次のとおりです。

  1. は、SEの最後の要素の次の位置を確認します(リスト全体を削除)

  2. (何もしない)空のリストのケースをハンドルハンドル1要素のリストケースその要素にNoneにその次の、そして最後のポイントT:

def delete (self): #want to delete last cell 
    if self.top is None: 
     return None 
    if self.top == self.last: 
     self.top, self.last = None, None 
     self.length = 0 
     return 
    self.length -= 1   
    current = self.top 
    while current.next != self.last: 
     current = current.next 
    current.next = None 
    self.last = current 
は値を持つセルを削除します。リストを空のリストについて

  1. チェック
  2. トラバース、要素 が発見されるまで、前任者を追跡します。
  3. 見つからない場合は何もしないでください。
  4. リンクされたリストの先頭を削除している場合は、先頭に戻る
  5. 見つかった場合は、先行するものを次のものの隣に指定します。

ここでは、そのアルゴリズムの例である:

def delete_value(self, value): 
    if self.top == null: # empty list 
     return 
    predecessor, current = None, self.top 
    while current.value != value: 
     predecessor = current 
     current = current.next 
    if current is None: # not found, nothing to do: 
     return 
    self.length -= 1 
    if predecessor is None: # self.top == current, we are deleting the head of the linked list 
     self.top = self.top.next 
    else: 
     predecessor.next = current.next 
+0

最後のセルではなく、値のあるセルを削除したいのですが?たとえば数字です。削除(40)、値40のセルを削除したい –

+0

上記のアップデートをご覧ください。 – 2ps

1

current.next=Noneは、whileループの外にする必要があります:あなたは最後の要素を削除したい場合、私は、あなたのwhileループが何をしているのかわからないんだけど

def delete (self): #want to delete last cell 
    if self.top == None: 
     return None 
    self.length -=1 
    current = self.top 
    nextcell = self.top.next 
    while (nextcell != None): 
     if nextcell == self.last: 
      current = self.last 
      break 
     current = current.next 
     nextcell = nextcell.next 
    # current.next should be run only after finding the last element 
    # so place it outside the loop 
    current.next= None 
+0

そして、何私は値がない最後のセルが、セルを削除したい場合は?例えばnumbers.delete(40)、値40のセルを削除したい場合 –

関連する問題