class Node:
"""
定义节点类
data:数据
_next:下一个数据
"""
def __init__(self
, data
, _next
=None):
self
.data
= data
self
._next
= _next
def __repr__(self
):
"""
用来定义Node的字节输出, __repr__()方法是object类提供的方法,
所有的Python对象都具有__repr__() 方法。它是一个“自我描述”的方法,
该方法通常实现场景是:当开发人员直接打印该对象时,
系统将会输出该对象的“自我描述”信息,用来告诉外界该对象具有的状态信息。
object类提供的__repr__()方法总是返回该对象实现类的“类名+object at + 内存地址 ”值,
这个返回值并不能真正实现“自我描述”的功能,
因此如果用户需要自定义类能实现“自我描述”的功能,就必须重写__repr__()方法。
"""
return str(self
.data
)
class ChainTable(Node
):
"""
定义链表
"""
def __init__(self
):
self
.head
= None
self
.length
= 0
def isEmpty(self
):
return (self
.length
== 0)
def add(self
, dataOrNode
):
item
= None
if isinstance(dataOrNode
, Node
):
item
= dataOrNode
else:
item
= Node
(dataOrNode
)
if not self
.head
:
self
.head
= item
self
.length
+= 1
else:
node
= self
.head
while node
._next
:
node
= node
._next
node
._next
= item
self
.length
+= 1
def delete(self
, index
):
if self
.isEmpty
():
print("链表是空的")
return
if index
< 0 or index
>= self
.length
:
print("超出索引长度")
return
if index
== 0:
self
.head
= self
.head
._next
self
.length
-= 1
return
j
= 0
node
= self
.head
prev
= self
.head
while node
._next
and j
< index
:
prev
= node
node
= node
._next
j
+= 1
if j
== index
:
prev
._next
= node
._next
self
.length
-= 1
def update(self
, index
, data
):
if self
.isEmpty
() or index
< 0 or index
>= self
.length
:
print('索引超出范围')
return
j
= 0
node
= self
.head
while node
._next
and j
< index
:
node
= node
._next
j
+= 1
if j
== index
:
node
.data
= data
def getItem(self
, index
):
if self
.isEmpty
() or index
< 0 or index
>= self
.length
:
print('超出索引长度')
return
j
= 0
node
= self
.head
while node
._next
and j
< index
:
node
= node
._next
j
+= 1
return node
.data
def print_chain(self
):
if self
.isEmpty
():
print('链表为空')
num
= []
node
= self
.head
while node
:
num
.append
(node
)
node
= node
._next
return num
def getIndex(self
, data
):
j
= 0
if self
.isEmpty
():
print('链表为空')
return
node
= self
.head
while node
:
if node
.data
== data
:
return j
node
= node
._next
j
+= 1
if j
== self
.length
:
print("%s not found" % str(data
))
return
def insert(self
, index
, dataOrNode
):
if self
.isEmpty
():
print('链表为空')
return
if index
< 0 or index
>= self
.length
:
print('超出索引长度')
return
item
= None
if isinstance(dataOrNode
, Node
):
item
= dataOrNode
else:
item
= Node
(dataOrNode
)
if index
== 0:
item
._next
= self
.head
self
.head
= item
self
.length
+= 1
return
j
= 0
node
= self
.head
prev
= self
.head
while node
._next
and j
< index
:
prev
= node
node
= node
._next
j
+= 1
if j
== index
:
item
._next
= node
prev
._next
= item
self
.length
+= 1
def clear(self
):
self
.head
= None
self
.length
= 0
def __repr__(self
):
if self
.isEmpty
():
return "链表为空"
node
= self
.head
nlist
= ''
while node
:
nlist
+= str(node
.data
) + ' '
node
= node
._next
return nlist
def __getitem__(self
, ind
):
if self
.isEmpty
() or ind
< 0 or ind
>= self
.length
:
print("超出索引长度")
return
return self
.getItem
(ind
)
def __setitem__(self
, ind
, val
):
if self
.isEmpty
() or ind
< 0 or ind
>= self
.length
:
print("超出索引长度")
return
self
.update
(ind
, val
)
def __len__(self
):
return self
.length
chainTable
= ChainTable
()
for i
in range(10):
chainTable
.add
(i
)
print(chainTable
.getIndex
(1))
print(chainTable
.print_chain
())
在节点的删除操作,和对链表的销毁操作中。不必担心太多节点储存在内存中而出现内存泄漏的现象。因为Python有自动垃圾回收机制。当然如果觉得不删除节点不爽的话,可以调用对象的del()方法。
参考文章
转载请注明原文地址: https://lol.8miu.com/read-7940.html