Creating a doubly-linked list class, and I've run into a problem with my __insert__
method. Here's my code for the class so far:
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
### 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.head.next
if nidx >= len(self):
raise IndexError
for i in range(nidx):
currNode = currNode.next
currNode.val = 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):
currNode = currNode.next
currNode.prior.next = currNode.next
currNode.next.prior = currNode.prior
self.length -= 1
def __len__(self):
"""Implements `len(self)`"""
return self.length
def __iter__(self):
"""Supports iteration (via `iter(self)`)"""
cursor = self.head
while cursor:
yield cursor.val
cursor = cursor.next
def insert(self, idx, value):
nidx = self._normalize_idx(idx)
currNode = self.head.next
for i in range(nidx):
currNode = currNode.next
currNode.next = currNode.prior.next
currNode.prior = currNode.next.prior
currNode.val = value
self.length += 1
Testing this using :
# test single-element manipulation (don't edit)
from unittest import TestCase
import random
tc = TestCase()
lst = LinkedList()
data = []
for _ in range(100):
to_ins = random.randrange(1000)
ins_idx = random.randrange(len(data)+1)
data.insert(ins_idx, to_ins)
lst.insert(ins_idx, to_ins)
for i in range(100):
tc.assertEqual(data[i], lst[i])
I come across an error where I end up with an error saying 896 ! = 541. The debugger is pointing to a line in the test case code tc.assertEqual(data[i], lst[i])
. I'm not sure how to go about fixing my insert method for this code to work correctly. Is there a loop that isn't being updated? Does anyone have a solution for this?
Aucun commentaire:
Enregistrer un commentaire