class SingleNode():
def __init__(self,item):
self._item=item
self._next=None
#获取节点的值
def getItem(self):
return self._item
#获取下一个指针
def getNext(self):
return self._next
#设置下一个节点
def setNext(self,newnext):
self._next=newnext
class SingleLinkedList():
#定义一个头单向链表的头指针
def __init__(self):
self._head=None
#判断链表是否为空
def isEmpty(self):
return self._head==None
#链表的长度
def size(self):
current=self._head
count=0
#当链表不为空
while current!=None:
count+=1
#将current后移一个节点
current=current.getNext()
return count
#遍历链表
def travel(self):
#将头节点赋给current
current=self._head
while current!=None:
#打印当前节点的值
print current.getItem()
current=current.getNext()
#链表头部添加节点
def add(self,item):
#新建一个节点
temp=SingleNode(item)
#新节点的下一个节点为头指针指向的值
temp.setNext(self._head)
#将新节点设置为头指针指向的节点
self._head=temp
#链表尾部添加节点
def append(self,item):
temp=SingleNode(item)
if self.isEmpty():
self._head=temp
else:
current=self._head
#当前节点的下一个节点不为空
while current.getNext()!=None:
current=current.getNext()
#最后一个节点的下一个节点为要添加的节点
current.setNext(temp)
#链表查找节点是否存在,并返回True或者False
def search(self,item):
current=self._head
founditem=False
while current!=None and not founditem:
if current.getItem()==item:
founditem=True
else:
current=current.getNext()
return founditem
#删除链表中的节点
def remove(self,item):
current=self._head
pre=None
while current!=None:
if current.getItem()==item:
#如果第一个就是删除的节点
if not pre:
#将头指针指向头节点的后一个节点
self._head=current.getNext()
else:
#将要删除节点的前一个节点的指针指向该节点之后的一个节点
pre.setNext(current.getNext())
break
else:
#就继续按链表后移节点
pre=current
current=current.getNext()
SingleLinkedList类中的add函数添加第3个数值的时候不会顶掉第二个数值吗?
如果不会那为什么 SingleNode类的setNext不是赋值语句吗?麻烦请解答 谢谢
python 单向链表问题
答案:2 悬赏:0 手机版
解决时间 2021-02-08 07:04
- 提问者网友:世勋超人
- 2021-02-07 23:50
最佳答案
- 五星知识达人网友:等灯
- 2021-02-08 01:06
不会。
实际上,SingleLinkedList只存储了链表的表头节点的位置。
每次调用add函数,相当于新建了一个节点,
调用setNext将其下一节点指向现在链表的表头,
然后将新建的节点位置作为新的表头位置保存在链表里面。
要得到链表的所有节点必须从表头节点开始一个一个往下跳转,一直跳转到下一节点位置为None,则表示查询完毕。
实际上,SingleLinkedList只存储了链表的表头节点的位置。
每次调用add函数,相当于新建了一个节点,
调用setNext将其下一节点指向现在链表的表头,
然后将新建的节点位置作为新的表头位置保存在链表里面。
要得到链表的所有节点必须从表头节点开始一个一个往下跳转,一直跳转到下一节点位置为None,则表示查询完毕。
全部回答
- 1楼网友:逐風
- 2021-02-08 01:30
node没什么问题,就是变量定义的时候是一个下划线而不是两个
stack这里有点问题,
(不知道你这里为啥需要做成一个循环的链表,不过不管了)
1. 首先你得定义一个head和一个tail,这样的话才能把tail和head连接形成一个循环
2. 初始化stack的话把head和tail都设置成none表示这是个空的stack
3. push的话看你喜欢这么写了,比较喜欢的是把push进去的node作为新的head,然后修改一下self._head为新node,然后修改新node的next为老的head,再连接一下tail和head便可,这样就省掉一些循环
4. pop的话就加一些判定好了,首先看head是不是none,如果是就说明stack是空的。如果发现tail和head都是同一个的话就说明stack里就一项了,提取完head之后就设置stack为空吧。然后先提取head,然后读取head后面的那一个node并且设置为新的head,然后再连接一下tail和head便可
5. 附上代码供参考.
class node:
def __init__(self, newdata):
self._data = newdata
self._next = none
def getdata(self):
return self._data
def getnext(self):
return self._next
def setdata(self, newdata):
self._data = newdata
def setnext(self, newnode):
self._next = newnode
class stack:
def __init__(self):
self._head = none
self._tail = none
def push(self, data):
print 'push',data,'into stack'
new = node(data)
cur = self._head
end = self._tail
if cur is none:
self._head = new
new.setnext(new)
self._tail = new
else:
new.setnext(self._head)
self._head = new
self._tail.setnext(new)
def pop(self):
if self._head is not none:
cur = self._head
print 'pop',cur.getdata(),'out of stack'
if cur.getnext() is not cur:
self._head = cur.getnext()
self._tail.setnext(self._head)
else:
self._head = none
self._tail = none
else:
print 'stack is empty'
my = stack()
for i in range(5):
my.push(i)
for i in range(6):
my.pop()
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯