Python 我的实现是一个链表,不需要设置回自己的头?
作为软件工程研究期间的一项任务,我必须用python实现我自己的列表类型,我使用了链表 根据我过去的经验,每当我使用 self=self.next 我必须先保存我的头部节点,然后再将头部分配回自我 在这个链表实现中,我完全忘记了它,但一切似乎都很好 无论如何,我需要的不是“如何”做某事的帮助,我只是想了解它是如何工作的,而不保留和分配头节点回来,希望它很好,谢谢Python 我的实现是一个链表,不需要设置回自己的头?,python,list,python-3.x,linked-list,nodes,Python,List,Python 3.x,Linked List,Nodes,作为软件工程研究期间的一项任务,我必须用python实现我自己的列表类型,我使用了链表 根据我过去的经验,每当我使用 self=self.next 我必须先保存我的头部节点,然后再将头部分配回自我 在这个链表实现中,我完全忘记了它,但一切似乎都很好 无论如何,我需要的不是“如何”做某事的帮助,我只是想了解它是如何工作的,而不保留和分配头节点回来,希望它很好,谢谢 class MYList: def __init__(self,*args): numargs = len(args)
class MYList:
def __init__(self,*args):
numargs = len(args)
self.value = None
self.next = None
if(numargs == 0):
pass
elif(numargs == 1):
self.value = args[0]
elif(numargs == 2):
self.value = args[0]
self.next = MYList(args[1])
else:
self.value = args[0]
self.next = MYList(*args[1:])
def get_value(self,k):
i=0
while(i<k):
self = self.next
i+=1
return self.value
def set_value(self,k,v):
i=0
while(i<k):
self = self.next
i+=1
self.value = v
def len(self):
i=0
while(self.next!=None):
self = self.next
i+=1
return i+1
def append(self, *args):
if(len(args) == 1):
v=args[0]
if(self.get_value(0) == None):
self.set_value(0, v)
else:
i = 0
while(self.next != None):
self = self.next
i += 1
self.next = MYList(v)
else:
v=args[0]
if(self.get_value(0) == None):
self.set_value(0, v)
else:
i = 0
while(self.next != None):
self = self.next
i += 1
self.next = MYList(v)
self.append(*args[1:])
def print(self):
if(self.value == None):
print("List is empty!")
else:
amount = self.len()
for _ in range(amount):
if(_ < amount-1):
print(self.value,end=',')
else:
print(self.value)
self=self.next
def pop(self,*args):
if(len(args) == 0):
count = self.len()
head=self
for _ in range(count-1):
self = self.next
v = self.value
self = head
for _ in range(count-2):
self = self.next
self.next = None
return v
elif(len(args)>1):
raise Exception("Enter a key to pop only!")
else:
k = args[0]
count = self.len() - 1
if(k>count):
raise Exception("Key too high!")
elif(k==0):
v=self.value
self.value = self.next.value
self.next = self.next.next
return v
else:
head=self
for _ in range(-1,k-1):
self = self.next
v = self.value
temp_next = self.next
self = head
for _ in range(-1,k-2):
self = self.next
self.next = temp_next
return v
为什么链接列表中的最后一个节点需要链接回头部?这将创建一个圆圈,或者最多,使sentinel最终更难测试,没有更好的选择。我的问题是关于所有使用self=self.next行的函数,我试图理解,即使我没有将头部重新分配给self,但在它之后,一切仍然正常。self只是函数中的另一个变量;您可以使用node=self,然后使用node=node.next,如果更清楚的话。只要函数的其余部分不需要访问从中启动的原始节点,就可以重新绑定self。