当前位置: 首页 > news >正文

python链表实现多项式_Python数据结构——链表的实现

https://www.cnblogs.com/linxiyue/p/3551633.html

链表由一系列不必在内存中相连的结构构成,这些对象按线性顺序排序。每个结构含有表元素和指向后继元素的指针。最后一个单元的指针指向NULL。为了方便链表的删除与插入操作,可以为链表添加一个表头。

161920313737412.jpg

删除操作可以通过修改一个指针来实现。

161952084799523.jpg

插入操作需要执行两次指针调整。

162002026535079.jpg

1. 单向链表的实现

1.1 Node实现

每个Node分为两部分。一部分含有链表的元素,可以称为数据域;另一部分为一指针,指向下一个Node。

1

2

3

4

5

6

7

8

9

10

11

12

13

class Node():

__slots__=['_item','_next']#限定Node实例的属性

def __init__(self,item):

self._item=item

self._next=None #Node的指针部分默认指向None

def getItem(self):

return self._item

def getNext(self):

return self._next

def setItem(self,newitem):

self._item=newitem

def setNext(self,newnext):

self._next=newnext

1.2 SinglelinkedList的实现

1

2

3

4

class SingleLinkedList():

def __init__(self):

self._head=None #初始化链表为空表

self._size=0

1.3 检测链表是否为空

1

2

def isEmpty(self):

return self._head==None

1.4 add在链表前端添加元素

1

2

3

4

def add(self,item):

temp=Node(item)

temp.setNext(self._head)

self._head=temp

1.5 append在链表尾部添加元素

1

2

3

4

5

6

7

8

9

10

def append(self,item):

temp=Node(item)

if self.isEmpty():

self._head=temp#若为空表,将添加的元素设为第一个元素

else:

current=self._head

while current.getNext()!=None:

current=current.getNext()#遍历链表

current.setNext(temp)#此时current为链表最后的元素

1.6 search检索元素是否在链表中

1

2

3

4

5

6

7

8

9

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

1.7 index索引元素在链表中的位置

1

2

3

4

5

6

7

8

9

10

11

12

13

14

def index(self,item):

current=self._head

count=0

found=None

while current!=None and not found:

count+=1

if current.getItem()==item:

found=True

else:

current=current.getNext()

if found:

return count

else:

raise ValueError,'%s is not in linkedlist'%item

1.8 remove删除链表中的某项元素

1

2

3

4

5

6

7

8

9

10

11

12

13

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()

1.9 insert链表中插入元素

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

def insert(self,pos,item):

if pos<=1:

self.add(item)

elif pos>self.size():

self.append(item)

else:

temp=Node(item)

count=1

pre=None

current=self._head

while count

count+=1

pre=current

current=current.getNext()

pre.setNext(temp)

temp.setNext(current)

全部代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

class Node():

__slots__=['_item','_next']

def __init__(self,item):

self._item=item

self._next=None

def getItem(self):

return self._item

def getNext(self):

return self._next

def setItem(self,newitem):

self._item=newitem

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.getNext()

return count

def travel(self):

current=self._head

while current!=None:

print current.getItem()

current=current.getNext()

def add(self,item):

temp=Node(item)

temp.setNext(self._head)

self._head=temp

def append(self,item):

temp=Node(item)

if self.isEmpty():

self._head=temp#若为空表,将添加的元素设为第一个元素

else:

current=self._head

while current.getNext()!=None:

current=current.getNext()#遍历链表

current.setNext(temp)#此时current为链表最后的元素

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 index(self,item):

current=self._head

count=0

found=None

while current!=None and not found:

count+=1

if current.getItem()==item:

found=True

else:

current=current.getNext()

if found:

return count

else:

raise ValueError,'%s is not in linkedlist'%item

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()

def insert(self,pos,item):

if pos<=1:

self.add(item)

elif pos>self.size():

self.append(item)

else:

temp=Node(item)

count=1

pre=None

current=self._head

while count

count+=1

pre=current

current=current.getNext()

pre.setNext(temp)

temp.setNext(current)

if __name__=='__main__':

a=SingleLinkedList()

for iin range(1,10):

a.append(i)

print a.size()

a.travel()

print a.search(6)

print a.index(5)

a.remove(4)

a.travel()

a.insert(4,100)

a.travel()

相关文章:

  • python的整数类型_Python数字类型Number
  • python变量名有哪些_python变量名命名规则
  • unity3d 求两个点长度_初二数学经典的做对称求最小值问题,也是中考中的常客...
  • java调用shell获取错误信息_python学习笔记---linux/windows调用sas程序
  • python中continue和pass的区别_Python中 break continue pass 之间的异同点
  • python装饰器wrappe_Python进阶-III 函数装饰器(Wrapper)
  • java 传绝对路径无效_java架构师系列1-数据结构(2)数组
  • ros 机械臂复位_DYNAMIXEL PRO PH54-200-S500-R 开源机械臂
  • pb数据窗char只有255_MySQL的基本数据类型
  • c语言 malloc_研究了多年C语言,却还没有搞懂malloc和free
  • 从零开始学python数据分析 电子版_从零开始学Python数据分析与挖掘[PDF][67.81MB]
  • 蓝桥杯c语言难还是JAVA难_校园人物 | 用C语言谱写别样人生——记校“十佳青年”数大学院孙露明...
  • mfc倾斜文本输入_一文解读光学字符识别(OCR)与手写文本识别(HTR)
  • python三大神器_Python三神器之virtualenv、virtualenvwrapper
  • 单学python能找工作吗_我为什么推荐学Python,但不希望大家用Python找工作?
  • 【Linux系统编程】快速查找errno错误码信息
  • 【mysql】环境安装、服务启动、密码设置
  • css布局,左右固定中间自适应实现
  • Java读取Properties文件的六种方法
  • js如何打印object对象
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • passportjs 源码分析
  • Python socket服务器端、客户端传送信息
  • 对象引论
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 开发基于以太坊智能合约的DApp
  • 实战|智能家居行业移动应用性能分析
  • 限制Java线程池运行线程以及等待线程数量的策略
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • 积累各种好的链接
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • # centos7下FFmpeg环境部署记录
  • (1)STL算法之遍历容器
  • (C语言)fgets与fputs函数详解
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (论文阅读11/100)Fast R-CNN
  • (四)库存超卖案例实战——优化redis分布式锁
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • (转)LINQ之路
  • (转)shell中括号的特殊用法 linux if多条件判断
  • .NET Core 2.1路线图
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .net framework 4.0中如何 输出 form 的name属性。
  • .NET 材料检测系统崩溃分析
  • [ vulhub漏洞复现篇 ] Django SQL注入漏洞复现 CVE-2021-35042
  • []Telit UC864E 拨号上网
  • [BZOJ1178][Apio2009]CONVENTION会议中心
  • [GXYCTF2019]BabyUpload1 -- 题目分析与详解
  • [GXYCTF2019]禁止套娃
  • [iOS]-NSTimer与循环引用的理解
  • [Java] 模拟Jdk 以及 CGLib 代理原理
  • [Java][Liferay] File system in liferay
  • [Java基础] Java中List.remove报错UnsupportedOperationException
  • [LeetCode]-283. 移动零-1089. 复写零
  • [MicroPython]TPYBoard v102 CAN总线通信