链表python
1. python编程中实现linkedlist(链表)报错是因为什么,怎么解决
楼主你好!
看你的代码存在很多问题,一个个来说明
1)首先你代码的报错源于你想用list来展开你的SLinkedList类,在python中,除非内置的可迭代对象外,其他都需要实现__iter__()函数,才能用list来进行展开。注意:判断一个对象是否可迭代,请使用isinstance(obj, Iterable)来判断obj是不是可以迭代,Iterable需要从collections中导入
2)插入的方法存在严重问题,按楼主的方法插入的话,因为头节点始终在变,所以当你需要遍历链表的时候就会找不到头节点;
3)pop的方法实现也有问题,因为是单向链,所以无法从末节点开始删除,只能删除头节点
4)top方法的意图未知
其他:
下面列举了一下我修改后的方案,做了一些锦上添花的操作,每个基本操作都会返回链表对象,这样就可以使用链式操作来写代码;迭代函数使用yield来实现,避免展开时占用不必要的内存。
另:我的展开时直接取链表中各个节点的元素,加了一些关键注释在代码中;
#-*-coding:utf-8-*-
classNode:
def__init__(self):
'''
elm:节点元素
nxt:下个节点指针
'''
self.elm,self.nxt=None,None
classSLinkedList:
def__init__(self):
'''
head:链表头
end_point:链表尾
'''
self.head=None
self.end_point=None
defpush(self,x):
p=Node()
p.elm=x
ifself.headisNone:
self.head=p
self.end_point=p
returnself
self.end_point.nxt=p
self.end_point=p
returnself
defpop(self):
'''因为实现的是一个单链表,所以只能从头开始删除节点'''
ifself.head.nxtisNone:
return
self.head=self.head.nxt
returnself
def__iter__(self):
temp_node=self.head
whiletemp_nodeisnotNone:
yieldtemp_node.elm
temp_node=temp_node.nxt
if__name__=='__main__':
'''增加1,2,5三个元素,并删除一个头节点'''
mylinklist=SLinkedList().push(1).push(2).push(5).pop()
print(list(mylinklist))
其实python这个语言使用链表有些画蛇添足,但是如果拿来当作需求练手也无妨。
望采纳,谢谢!
2. 关于python链表的运行
看你运行几次,我给你一条一条说
头 1->2->3->4->5->6->7->8->9 NONE
pointer=head #这里你没说清,我先假设这个head是链表的第一个,1
newnode={ } #空字典
newnode['data']=20 #添加关键字data=20进字典。
newnode['next']=pointer #字典的next目标指向pointer,也就是head,也就是1,但是是链表这个object,不是指向一个数字
head=newnode #重新定义head为newnode这个字典。head指向{‘data’:20, ‘next’:pointer}这个字典。
pointer=pointer['next'] #pointer指向pointer['next'],也就是pointer现在指向链表的第二个,2
pointer['next']=none #pointer['next']设为none,也就是现在pointer这个链表就被截断了。只包含1->2->none
3. python中的链表(linked list)
凤鸾宝帐景非常,尽是泥金巧样妆。
曲曲远山飞翠色,翩翩舞袖映霞裳。
梨花带雨争娇艳,芍药笼烟骋媚妆。
但得妖娆能举动,取回长乐侍君王。
// 这题需要使用辗转相除法,又名欧几里德算法(Euclideanalgorithm)
#include <stdio.h>
int main (void)
{
int m, n, p, tmp;
printf ("Please type in two number:\n");
scanf ("%i %i", &m, &n); //输入两个数,分别放入m, n
p=m*n; //先把两数的积算出来,后面m和n的值会有变
while (n!=0){
tmp=m%n;
m=n;
n=tmp; //这段是求最大公约数的算法
}
printf ("The GCD is %i\n", m); //上面的算法n=0时m这时的值就是最大公约数
printf ("The LCM is %i\n", p/m);//两数的积除以最大公约数就是最小公倍数了
return 0;
}
4. python 链表问题
classUnorderedList:
def__init__(self):
self.head=None
defadd(self,item):
new_node=Node(item)
new_node.set_next(self.head)
self.head=new_node
defsize(self):
current=self.head
count=0
whilecurrent!=None:
count=count+1
current=current.get_next()
returncount
defis_empty(self):
returnself.head==None
defadd_all(self,other_list):
foriteminother_list:
self.add(item)
returnself.head
def__iter__(self):
current=self.head
whilecurrent:
yieldcurrent
current=current.get_next()
defprint_all(self):
foriteminself:
print(item.get_data())
classNode:
def__init__(self,init_data):
self.data=init_data
self.next=None
defget_data(self):
returnself.data
defget_next(self):
returnself.next
defset_data(self,new_data):
self.data=new_data
defset_next(self,new_next):
self.next=new_next
if__name__=="__main__":
s=UnorderedList()
s.add(33)
s.add(44)
s.add_all([1,2,3,4])
s.print_all()
5. python有链表吗
python中的链表(linked list)是一组数据项的集合,其中每个数据项都是一个节点的一部分,每个节点还包含指向下一个节点的链接。链表有两种类型:单链表和双链表。
链表的数据结构
在链表中删除操作可以通过修改指针来实现,
插入则是调整,插入点的前后两个指针的指向关系,
在python中每个变量都是指针,例如:
用内置数据结构(list,dict,tuple等)的嵌套/组合,它们隐式地包含了指向/嵌套关系,如graph[u][v]={w0,w1..}类的成员变量、嵌套类可能包含了指向/嵌套关系;
引用表示指向关系,只不过引用不能像指针一样运算,比如p+1指向下一个元素,所以可能限制颇多。因此,要实现链表的操作,不能和c一样直接对指针进行操作。
python学习网,大量的免费python视频教程,欢迎在线学习!
6. 如何使用python建立链表
classListNode:
def__init__(self,x):
self.val=x
self.next=None
l1=newListNode(0)
l1.next=newListNode(1)
7. python 单向链表问题
不会。
实际上,SingleLinkedList只存储了链表的表头节点的位置。
每次调用add函数,相当于新建了一个节点,
调用setNext将其下一节点指向现在链表的表头,
然后将新建的节点位置作为新的表头位置保存在链表里面。
要得到链表的所有节点必须从表头节点开始一个一个往下跳转,一直跳转到下一节点位置为None,则表示查询完毕。
8. python如何判断一个链表是否为环状
设置两个指针,开始都指向链表头,然后其中一个指针每次向前走一步,另一个指针每次向前走两步,如果快的遇到NULL了,证明该链表中没有环,如果有环,快的指针每次都要比慢的多走一步,最终两个指针会相遇,(注意:这里快指针不会跳过慢指针而不相遇,因为它每次都只比慢指针多走一个单位) bool judge(list *head){if(head == NULL){return false;//没有环} list *pFast = head; list *pSlow = head; while(pFast-next != NULL && pFast-next-next != NULL){pFast = pFast-next-next; pSlow = pSlow-next;
9. python数组和链表的区别
scores是数组所以scores[index]快,如果scores是链表的话要还要挨个遍历所以scores[index]慢。
从这点来说你的理解是对的,链表找第几个确实比数组找第几个慢得多。因为链表要挨个遍历,数组直接取偏移地址就好了。