Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python上的链表上实现insert方法_Python_Oop_Data Structures_Linked List - Fatal编程技术网

在python上的链表上实现insert方法

在python上的链表上实现insert方法,python,oop,data-structures,linked-list,Python,Oop,Data Structures,Linked List,正在尝试为单链表创建一个方法,并努力理解此测试用例失败的原因。在我的第二个类SLinkedList中,我有一个名为insert的方法,它接受参数pos,它是一个整数。现在在我的测试用例中,当我将middle添加到位置4时,它停止引用链表中的任何其他节点,这意味着包含middle数据的节点没有对包含77的节点的引用。我不明白为什么会这样?我对它进行了编程,当current_pos==pos时,我们将当前的下一个(新的_节点)设置为current.getNext()(77)。我不是把2的下一个分配到

正在尝试为单链表创建一个方法,并努力理解此测试用例失败的原因。在我的第二个类SLinkedList中,我有一个名为insert的方法,它接受参数pos,它是一个整数。现在在我的测试用例中,当我将middle添加到位置4时,它停止引用链表中的任何其他节点,这意味着包含middle数据的节点没有对包含77的节点的引用。我不明白为什么会这样?我对它进行了编程,当current_pos==pos时,我们将当前的下一个(新的_节点)设置为current.getNext()(77)。我不是把2的下一个分配到中间,把中间的下一个分配到77吗

class SLinkedListNode:
    # an instance of this class is a node in a Single Linked List
    # a node has a reference to data and reference to next
    def __init__(self,initData,initNext):
        self.data = initData
        self.next = initNext

    def getNext(self):
        return self.next

    def getData(self):
        return self.data

    def setData(self,newData):
        self.data = newData

    def setNext(self,newNext):
        self.next = newNext


class SLinkedList:
    # an instance of this class is a Singly-Linked List object
    # it has reference to the first node in the list
    def __init__(self):
        self.head = None
        self.size = 0

    def add(self,item):
        # adds an item at the start of the list
        new_node = SLinkedListNode(item,None)
        new_node.setNext(self.head)
        self.head = new_node
        self.size = self.size + 1

    def append(self,item):
        # adds an item at the end of the list
        new_node = SLinkedListNode(item,None)
        current = self.head # Start the traversal
        if self.size == 0: # check if list is empty
            self.add(item)
        else:
            while (current.getNext()!=None):
                current= current.getNext() # traversing the list
            current.setNext(new_node)
            self.size = self.size +1


    def insert(self,pos,item):
        # inserts the item at pos
        # pos should be a positive number (or zero) of type int
        assert type(pos)==int,'Error:pos is not an integer'
        assert pos>=0,'Error:pos must be positive'
        current=self.head
        new_node= SLinkedListNode(item,None)    
        if pos==0:
            self.add(item)
        elif pos==self.size:
            self.append(item)
        else:
            current_pos=0
            while(current.getNext()!=None):


                if (pos-1)==current_pos:
                    print(current.getData())
                    current.setNext(new_node)

                if pos==current_pos:
                    print(current.getData())

                    new_node.setNext(current.getNext())    
                current=current.getNext()


                current_pos+=1
            self.size+=1



   # 1--> 2--->inserteditem---> 3-->4---> 5---> 6             





        # TO DO: write assert statement that tests if pos is int
        # TO DO: write assert statement that tests that pos is not negative
        # TO DO: COMPLETE THE METHOD 



    def remove(self,item):
        # remove the node containing the item from the list
        if self.size == 0:
            raise Exception('List is Empty')
        current = self.head
        previous = None
        found = False
        while current != None and not found:
            if current.getData() == item:
                found = True
            else:
                previous = current
                current = current.getNext()
        if not found:
            raise Exception('Item not in list')
        else:
            if previous == None: # the item is in the first node of the list
                self.head = current.getNext()
            else: # item is not in the first node
                previous.setNext(current.getNext())
            self.size = self.size -1

    def index(self,item):
        # finds the location of the item in the list
        if self.size == 0:
            raise Exception('List is empty')
        position = 0
        found = False
        current = self.head
        while current != None and not found:
            if current.getData() == item:
                found = True
            else:
                current = current.getNext()
                position = position + 1
        if found:
            return position
        else:
            return 'Item not found'

    def pop(self):
        # removes the node from the end of the list and returns the item 
        if self.size == 0:
            raise Exception('List is empty')
        current = self.head
        previous = None
        while current.getNext() != None:
            previous = current
            current = current.getNext()
        if previous == None:
            self.head = None
        else:
            previous.setNext(None)
        self.size = self.size -1
        return current.getData()

    def __str__(self):
        # returns a string representation of the list
        current = self.head
        string = ''
        while current != None:
            string = string + str(current.getData())+'->'
            current = current.getNext()
        return string

    def getSize(self):
        return self.size


def main():
    # Testing Singly-Linked List
    slist = SLinkedList()
    slist.add(2)
    slist.add(4)
    slist.add('A')
    slist.append(77)
    slist.append(6)
    slist.append('Z')
    print('Original List:', slist.getSize(), 'elements')
    print(slist)
    print()
    slist.insert(0,'start')
    print('After inserting the word start at position 0:', slist.getSize(), 'elements')
    print(slist)
    print()
    slist.insert(7,'end')
    print('After inserting the word end at position 7:', slist.getSize(), 'elements')
    print(slist)
    print()
    slist.insert(4,'middle')
    print('After inserting middle at position 4:', slist.getSize(), 'elements')
    print(slist)

if __name__=="__main__":
    main()

insert
-方法中查看此代码段:

其他:
当前位置=0
while(current.getNext()!=None):
如果(位置1)=当前位置:
打印(当前.getData())
current.setNext(新_节点)
如果位置==当前位置:
新建_node.setNext(current.getNext())
current=current.getNext()
当前位置+=1
满足第一个
if
-条件后,您将新节点设置为当前节点的下一个节点。请记住,这个新节点没有引用列表的其余部分。第二条if语句在此迭代期间不会执行,因此下一行要执行的是
current=current.getNext()
,它将
current
设置为新节点,仍然不引用列表的其余部分。因此,在while循环的下一次迭代中,
current.getNext()
的计算结果为
None
,迭代随即终止,有效地将新节点之后的所有节点从列表中删除

要解决此问题,请删除第二个
if
,并在上一个if语句中设置新节点的下一个节点。这样,您将保持对列表其余部分的引用


另一方面,
get
-和
set
-方法非常不和谐,您可以直接访问和修改这些属性,例如使用
current.next=which
。此外,在整个列表上进行
while
循环对于插入任务来说似乎效率相当低,因为您完全知道要将新节点插入到的索引。另外,如果位置大于列表长度,您的
insert
-方法将中断,您可能需要为此添加另一个检查