我正在创建一个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.写这些课程方法似乎总是让我失望,我可能会错过什么?我不确定这与典型的阵列支持列表有何不同。而且我不确定这个价值来自何处。
答案 0 :(得分:1)
我收到错误说1!= 20
这是一个真实的陈述,所以你的问题存在于如何设置列表的数据。它没有更新,但Python列表是。
嗯......也许是我不确定这个值是来自哪个
lst[1] = data[1] = 20
?
无论如何,我不认为你的setItem函数是正确的。 curNode
变量只有一个值,而不是基于getItem方法的Node
对象引用,因此,currNode = value
实际上并没有更新列表,只有局部变量作用于那个功能。