将元素插入头部后无法正确显示链表的元素



我有一个链表,其中每个节点都保存圆的数据(颜色,半径)。我有一个"形状"类,它有

(i)初始化:初始化circle_list。

(ii) get_circle_list():返回circle_list

(iii) insert_circle(new_circle):将新节点插入circle_list的头部位置。

函数init和insert_circle(new_circle)完美运行。但是当我尝试使用 get_circle_list() 时,它会返回旧circle_list而不是更新的。

例如,我要插入头部位置的新节点是("蓝色",6),然后insert_circle(new_circle)将其正确插入头部位置。但是当我尝试打印 shape.get_circle_list().display() 时,打印了相同的旧circle_list。

PS:请不要将此代码与循环链表混淆,事实并非如此。这是一个链表,其节点代表圆的特征,该列表的名称为circle_list。

class Node:
def __init__(self,data):
self.__data=data
self.__next=None
def get_data(self):
return self.__data
def set_data(self,data):
self.__data=data
def get_next(self):
return self.__next
def set_next(self,next_node):
self.__next=next_node

class LinkedList:
def __init__(self):
self.__head=None
self.__tail=None
def get_head(self):
return self.__head
def get_tail(self):
return self.__tail

def add(self,data):
new_node=Node(data)
if(self.__head is None):
self.__head=self.__tail=new_node
else:
self.__tail.set_next(new_node)
self.__tail=new_node
def insert(self,data,data_before):
new_node=Node(data)
if(data_before==None):
new_node.set_next(self.__head)
self.__head=new_node
if(new_node.get_next()==None):
self.__tail=new_node
else:
node_before=self.find_node(data_before)
if(node_before is not None):
new_node.set_next(node_before.get_next())
node_before.set_next(new_node)
if(new_node.get_next() is None):
self.__tail=new_node
else:
print(data_before,"is not present in the Linked list")
def display(self):
temp=self.__head
while(temp is not None):
print(temp.get_data())
temp=temp.get_next()
class Circle:
def __init__(self, color,radius):
self.__color=color
self.__radius=radius
def __str__(self):
return (self.__color+" "+str(self.__radius))
def get_color(self):
return self.__color
def get_radius(self):
return self.__radius

class Shape:
def __init__(self,circle_list):
self.__circle_list=circle_list
#Here is where the problem occurs
def get_circle_list(self):
return self.__circle_list
def insert_circle(self,new_circle):
newNode=Node(new_circle)
newNode.set_next(self.__circle_list.get_head())
self.__circle_list.__head=newNode

circle1=Circle("Red",4)
circle2=Circle("Green",5)
circle3=Circle("Purple",3.5)
new_circle=Circle("Blue",6)
circle_list=LinkedList()
circle_list.add(circle1)
circle_list.add(circle2)
circle_list.add(circle3)
shape=Shape(circle_list)
shape.insert_circle(new_circle)
#prints the same old circle_list here
shape.get_circle_list().display()

这是因为您使用的属性名称以两个下划线开头,例如__head__circle_list,并且 Python 对此类名称有特殊规则。

只使用一个下划线,或者不使用,你应该没问题。

python 解释器将以__(双下划线)开头的类成员的名称替换为 _classname__membername,以确保此名称不会与另一个类中的类似名称重叠。

在您的情况下,__head属性被解释为_LinkedList__head

调用insert_circle方法时,self.__circle_list.__head = newNode是在创建新的__head属性,而不是重新分配_LinkedList__head

您可以向LinkedList添加set_head方法

def set_head(self,new_head):
self.__head=new_head

然后在insert_circle方法中调用它。

def insert_circle(self,new_circle):
newNode=Node(new_circle)
newNode.set_next(self.__circle_list.get_head())
self.__circle_list.set_head(newNode)

您也可以直接访问_LinkedList__head属性

def insert_circle(self,new_circle):
newNode=Node(new_circle)
newNode.set_next(self.__circle_list.get_head())
self.__circle_list._LinkedList__head=newNode

使用以下代码将数据插入头部位置,

def insert_circle(self,new_circle):
self.__circle_list.insert(new_circle,None)

要显示列表:

def get_circle_list(self):
return self.__circle_list

将上述函数添加到代码中。

最新更新