Python 我的实现是一个链表,不需要设置回自己的头?

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)

作为软件工程研究期间的一项任务,我必须用python实现我自己的列表类型,我使用了链表

根据我过去的经验,每当我使用

self=self.next

我必须先保存我的头部节点,然后再将头部分配回自我

在这个链表实现中,我完全忘记了它,但一切似乎都很好

无论如何,我需要的不是“如何”做某事的帮助,我只是想了解它是如何工作的,而不保留和分配头节点回来,希望它很好,谢谢

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。