Как часть моего A-Level Cirriculum я стал свидетелем программы для создания связанного списка с возможностью добавления и удаления узлов.
К сожалению, моя экзаменационная комиссия продиктовала это заданным образом. c неортодоксальный путь. Они хотят, чтобы узлы были объектами с двумя атрибутами (data и Pointer), хранящимися в стандартном списке.
Невероятно важно, чтобы это было сделано таким образом, поскольку экзаменационная комиссия не принимает другие методы: (
Это метод конструктора для узла, который я должен использовать
class ListNode:
def __init__(self) :
self.data = int()
self.pointer = -1
Я целую вечность пробовал все виды вещей, чтобы заставить это работать должным образом, но я, кажется, не могу заставить его сохранять правильные указатели.
Может ли кто-нибудь помочь мне с рабочим решением, любая помощь очень ценится.
РЕДАКТИРОВАТЬ: Как и предполагалось, я публикую свою лучшую текущую попытку.
Пока у меня есть инициализация и добавление вниз (я думаю), но мне нужна помощь с удалением. Я также думаю, мне может понадобиться добавить мой код добавления для удаления на работу. Хотя я и не знал, как go держать указатели на правильных узлах после удаления.
Инициализация:
def initialiselist():
List = [Node() for i in range(10)]
startpointer = nullpointer
freelistptr = 0
for index in range(9):
List[index].pointer = index + 1
List[9].pointer = nullpointer
for i in List:
print(i.data, i.pointer)
return List, startpointer, freelistptr
Добавление узлов:
def insertnode(List, startpointer, freelistptr, newdata):
if startpointer == -1: #If list is empty
List[freelistptr].data = newdata
startpointer = freelistptr
freelistptr = List[startpointer].pointer
List[startpointer].pointer = -1
return(List,startpointer,freelistptr)
for i in List:
if i.data == newdata:
print("You cannot have duplicate data")
return(List,startpointer,freelistptr)
if freelistptr == -1:
print("The list is full")
return(List,startpointer,freelistptr)
elif freelistptr != -1: #If Lis is not empty
List[freelistptr].data = newdata
if List[startpointer].data > newdata: #If the new data is less than the startpointer
temp = List[freelistptr].pointer
List[freelistptr].pointer = startpointer
startpointer = freelistptr
freelistptr = temp
return(List,startpointer,freelistptr)
else: #If the new data is greater than the startpointer
if List[startpointer].pointer == -1:
List[startpointer].pointer = freelistptr
temp = freelistptr
freelistptr = List[freelistptr].pointer
List[temp].pointer = -1
return(List,startpointer,freelistptr)
nextnodeptr = List[startpointer].pointer
previousnodeptr = startpointer
newnodeptr = freelistptr
temp2 = List[freelistptr].pointer
while True:
if List[nextnodeptr].pointer == -1:
if List[nextnodeptr].data > newdata:
List[newnodeptr].pointer = nextnodeptr
List[previousnodeptr].pointer = newnodeptr
break
elif List[nextnodeptr].data < newdata:
List[nextnodeptr].pointer = newnodeptr
temp2 = List[freelistptr].pointer
List[newnodeptr].pointer = -1
break
if List[nextnodeptr].data > newdata:
temp2 = List[freelistptr].pointer
List[newnodeptr].pointer = nextnodeptr
List[previousnodeptr].pointer = newnodeptr
break
else:
previousnodeptr = nextnodeptr
nextnodeptr = List[nextnodeptr].pointer
freelistptr = temp2
return (List,startpointer,freelistptr)
Я знаю, что это просто полная стена текста, но я не привык здесь публиковать сообщения, так что извините.
Мой вопрос: как сделать я удаляю узлы?