私は、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の価値がどこから来ているのか分かりません。
私は、指定されたインデックスに項目を設定する方法がわからないと思います。 'currNode = self.head [nidx]'のようなコードを追加してコードを変更するとエラーが出ますが、適切なノードを特定する方法がわかりません –
リストを反復する必要がありますあなたがgetItemを使ったときと同じように、Nodeオブジェクトの次に、 'return curNode.val'の代わりに、その値を設定します。 –