2016-06-11 12 views
0

私は、LinkedListクラスを作成して、Python言語とその二重にリンクされたノードをよりよく理解しています。私の全体的な仕事は、コードの時間効率を最適化しようとしながら、Pythonのビルトインリストデータ構造を利用しないことです。私が想定しているものを修正するための最善の方法は、getitemまたはsetitemメソッド本体です。不一致エラーのトラブルシューティング?

class LinkedList: 
    class Node: 
     def __init__(self, val, prior=None, next=None): 
      self.val = val 
      self.prior = prior 
      self.next = next 

    def __init__(self): 
     self.head = LinkedList.Node(None) # sentinel node (never to be removed) 
     self.head.prior = self.head.next = self.head # set up "circular" topology 
     self.length = 0 


### prepend and append 

    def prepend(self, value): 
     n = LinkedList.Node(value, prior=self.head, next=self.head.next) 
     self.head.next.prior = self.head.next = n 
     self.length += 1 

    def append(self, value): 
     n = LinkedList.Node(value, prior=self.head.prior, next=self.head) 
     n.prior.next = n.next.prior = n 
     self.length += 1 


### subscript-based access ### 

    def _normalize_idx(self, idx): 
     nidx = idx 
     if nidx < 0: 
      nidx += len(self) 
      if nidx < 0: 
       nidx = 0 
     return nidx 

    def __getitem__(self, idx): 
     """Implements `x = self[idx]`""" 
     nidx = self._normalize_idx(idx) 
     currNode = self.head.next 
     for i in range(nidx): 
      currNode = currNode.next 
     if nidx >= len(self): 
      raise IndexError 
     return currNode.val 


    def __setitem__(self, idx, value): 
     """Implements `self[idx] = x`""" 
     nidx = self._normalize_idx(idx) 
     currNode = self[nidx] 
     if nidx >= len(self): 
      raise IndexError 
     currNode = value 

    def __delitem__(self, idx): 
     """Implements `del self[idx]`""" 
     nidx = self._normalize_idx(idx) 
     currNode = self.head.next 
     if nidx >= len(self): 
      raise IndexError 
     for i in range(nidx+1, len(self)): 
      self[i-1] = self[i] 
     del self[len(self)-1] 

テスト使用してこのコード:!

# test subscript-based access 
from unittest import TestCase 
import random 

tc = TestCase() 
data = [1, 2, 3, 4] 
lst = LinkedList() 
for d in data: 
    lst.append(d) 

for i in range(len(data)): 
    tc.assertEqual(lst[i], data[i]) 

with tc.assertRaises(IndexError): 
    x = lst[100] 

with tc.assertRaises(IndexError): 
    lst[100] = 0 

with tc.assertRaises(IndexError): 
    del lst[100] 

lst[1] = data[1] = 20 
del data[0] 
del lst[0] 

for i in range(len(data)): 
    tc.assertEqual(lst[i], data[i]) 

は、私はいつも私をつまずかように見えるこれらのクラスメソッドを書く1 = 20というエラーを取得したい、私は何が不足している可能性がありますか?私は、これが典型的なアレイバックアップリストとどのように異なっているか正確にはわかりません。そして、私はこの20の価値がどこから来ているのか分かりません。

答えて

1

私は真の文だ1!= 20

を言って、エラーを取得したい、しかし、ので、あなたの問題はあなたのリストのデータを設定する方法に存在します。更新されていませんでしたが、Pythonのリストは更新されました。

私はおそらく、この20値は

うーんlst[1] = data[1] = 20どこから来ているか分かりませんか?

とにかく、私はあなたのsetItem関数が正しいとは思わない。 curNode変数には値のみがあり、Nodeオブジェクト参照はgetItemメソッドに基づいていないため、currNode = valueは実際にその関数をスコープとするローカル変数のみを更新していません。

+0

私は、指定されたインデックスに項目を設定する方法がわからないと思います。 'currNode = self.head [nidx]'のようなコードを追加してコードを変更するとエラーが出ますが、適切なノードを特定する方法がわかりません –

+0

リストを反復する必要がありますあなたがgetItemを使ったときと同じように、Nodeオブジェクトの次に、 'return curNode.val'の代わりに、その値を設定します。 –

関連する問題