无法在循环单链接列表中插入节点

2024-09-25 00:30:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我无法在给定的代码中获得所需的输出。代码是关于在循环单链接列表中插入节点的。请根据所述问题更正此代码

class Node:
    def __init__(self,value):
        self.value = value
        self.next = None
 
class CircularSLL:
    
    def __init__(self):
        self.head = None
        self.tail = None
        
    def __iter__(self):
        node = self.head
        while node:
            yield node
            if node.next == self.head:
                print('break')
                break
            node = node.next
            
    def insertnode(self, value, location):
        new_node = Node(value)
        
        # check if head is None or not
        
        if self.head is None:
            self.head = new_node
            self.tail = new_node
            new_node.next = self.head
            
        else:
            
            
            
            # At the start
            if location == 0:
                new_node.next = self.head
                self.head = new_node
                self.tail.next = self.head
            
            # At the end
            elif location == -1:
                new_node.next = self.tail.next
                self.tail.next = new_node
                self.tail = new_node
                
            else:
                
                # At specific location
                temp_node = self.head
                index = 0
                
                while index < location - 1:
                    
                    # node is the last element
                    if temp_node.next == self.head:
                        break
                    temp_node = temp_node.next
                    index += 1
                
                next_node = temp_node.next
                temp_node.next = new_node
                new_node.next = next_node
                
                if temp_node.next == self.head:
                    self.tail == temp_node
                    self.tail.next = self.head
                
            return 'The node has been successfully inserted'
 
cll = CircularSLL()
 
cll.insertnode(1,0)
 
cll.insertnode(3, 1)
 
cll.insertnode(4, 2)
 
cll.insertnode(5, 3)
 
cll.insertnode(6, 4)
 
print([node.value for node in call]) 

输出=[1,3,4,5,6]

第一个问题-在索引='0'处插入时。

cll.insertnode(10,0)

输出=[10,1]

预期的

输出=[10,1,3,4,5,6]

第二个问题-放置位置时='-1'

cll.insertnode(30, -1)

输出=[1,30]

预期的

输出=[10,1,3,4,5,6,30]


Tags: 代码selfnonenodenewifvaluedef
1条回答
网友
1楼 · 发布于 2024-09-25 00:30:08

在测试设置中,插入第一个节点后,tail永远不会被设置

(Pdb) [c.value for c in cll]
[1, 3, 4, 5, 6]
(Pdb) cll.head.value
1
(Pdb) cll.tail.value
1
(Pdb) cll.head is cll.tail
True

你的第一个问题是你有self.tail == temp_node而不是self.tail = temp_node,所以让我们来解决这个问题。尽管如此,我们仍然没有得到预期的产出:

[1, 3, 4, 5, 6]

下一个问题是,当您选中if temp_node.next is self.head:时,您已经将temp_node.next设置为new_node。它永远不会是self.head。我相信您打算在此时检查new_node.next,因为它现在是最后一个元素

简单地替换

                if temp_node.next == self.head:
                    self.tail == temp_node
                    self.tail.next = self.head

                if new_node.next is self.head:
                    self.tail = new_node

得到

class Node:
    def __init__(self,value):
        self.value = value
        self.next = None

class CircularSLL:

    def __init__(self):
        self.head = None
        self.tail = None

    def __iter__(self):
        node = self.head
        while node:
            yield node
            if node.next is self.head:
                break
            node = node.next

    def insertnode(self, value, location):
        new_node = Node(value)

        # check if head is None or not

        if self.head is None:
            self.head = new_node
            self.tail = new_node
            new_node.next = self.head

        else:
            # At the start
            if location == 0:
                new_node.next = self.head
                self.head = new_node
                self.tail.next = self.head

            # At the end
            elif location == -1:
                new_node.next = self.tail.next
                self.tail.next = new_node
                self.tail = new_node

            else:
                # At specific location
                temp_node = self.head
                index = 0

                while index < location - 1:
                    # node is the last element
                    if temp_node.next is self.head:
                        break
                    temp_node = temp_node.next
                    index += 1

                next_node = temp_node.next
                new_node.next = next_node
                temp_node.next = new_node

                if new_node.next is self.head:
                    self.tail = new_node


            return 'The node has been successfully inserted'

cll = CircularSLL()

cll.insertnode(1,0)

cll.insertnode(3, 1)

cll.insertnode(4, 2)

cll.insertnode(5, 3)

cll.insertnode(6, 4)

cll.insertnode(10,0)

cll.insertnode(30, -1)

print([node.value for node in cll])

输出: [10, 1, 3, 4, 5, 6, 30]

我还在一些地方用is替换了==,以便更清楚地测试身份而不是等价值

相关问题 更多 >