python实现单链表
2018-11-23 本文已影响0人
爱搞事的喵
链表的定义:
链表(linked list)是由一组被称为结点的数据元素组成的数据结构,每个结点都包含结点本身的信息和指向下一个结点的地址。由于每个结点都包含了可以链接起来的地址信息,所以用一个变量就能够访问整个结点序列。也就是说,结点包含两部分信息:一部分用于存储数据元素的值,称为信息域;另一部分用于存储下一个数据元素地址的指针,称为指针域。链表中的第一个结点的地址存储在一个单独的结点中,称为头结点或首结点。链表中的最后一个结点没有后继元素,其指针域为空。
如下所示:
信息域 | 指正域 |
---|---|
(info) | (link) |
1.单链表结构
2. 单链表代码实现
class Node(object):
def __init__(self,value,p=0):
'''
创建一个类的数据结构 代表链表的一个节点
:param value: 数据域
:param p: 指向下一个数据域的指针
'''
self.data = value
self.next = p
class LinkList(object):
def __init__(self):
'''
初始化链表头部
'''
self.head = 0
def __setitem__(self, key, value):
'''
重新设置属性 key--value形式
:param key:
:param value:
:return:
'''
if self.is_empty():
print('linklist is empty')
elif key < 0 or key > self.getLength():
print("the given key is error")
else:
self.delete(key) #删除对应的key--value
self.insert(value,key) #重新设置新的key--value
def __getitem__(self, key):
'''
通过key 获取value
:param key:
:return:
'''
if self.is_empty():
print('linkList is empty')
elif key < 0 or key > self.getLength():
print('the given key is error')
else:
return self.getItem(key)
def initList(self,data):
'''
初始化单链表
:param data: 需要初始化的列表
:return:
'''
self.head = Node(data[0])
p = self.head
for i in data[1:]:
node = Node(i)
p.next = node
p = node
# p = p.next #or p = node
def insert(self,value,key):
'''
将数据插入指定位置key 获取插入之前的位置的节点node 和插入数据后面的节点node
:param value: 插入节点的值
:param key: 插入节点的索引
:return:
'''
if self.is_empty():
print("linkList is empty")
elif key < 0 or key > self.getLength():
print("the given key is error")
else:
'''如果key == 0'''
if key == 0:
q = Node(value,self.head)
self.head = q
print('---------index---------')
else:
p = self.head
post = self.head
j = 0
while p.next != 0 and j < key:
post = p
p = p.next
j += 1
if j == key:
node = Node(value,key)
post.next = node
node.next = p
print('----------------------')
def delete(self,key):
if self.is_empty():
print('linkList is empty')
return
if key < 0 or key > self.getLength():
print('the given key is error')
return
if key == 0:
# node = Node(self.getItem(key),key)
# self.head = node
self.head = self.head.next
else:
p = self.head
post = self.head
j = 0
while p.next != 0 and j < key:
post = p
p = p.next
j += 1
if j == key:
post.next = p.next
def append(self,value,key):
'''
添加数据 在链表的尾部
:param value:
:param key:
:return:
'''
node = Node(value,key)
if self.head == 0:
self.head = node
else:
p = self.head
while p!=0:
p = p.next
p.next = node
def is_empty(self):
'''
判断链表是否为空
:return:
'''
if self.getLength() == 0:
return True
else:
return False
def getItem(self,key):
'''
根据提供的key 索引查找对应的节点 node.data
:param key:
:return:
'''
if self.is_empty():
print('linkList is empty')
return
p = self.head
j = 0
while p.next != 0 and j<key:
p = p.next
j += 1
if j == key:
return p.data
else:
print('the data is not exist')
return
def getLength(self):
'''
获取链表的长度
:return:
'''
p = self.head
length = 0
while p != 0:
length += 1
p = p.next
return length
def index(self,value):
'''
根据值获取对应的索引 默认只匹配第一个值
:param value:
:return:
'''
if self.is_empty():
print('linkList is empty')
return
p = self.head
j = 0
while p.next != 0 and not p.data == value:
p = p.next
j += 1
if p.data == value:
return j
else:
return -1
def clear(self):
self.head = 0
link = LinkList()
arr = [1,2,3,4,5,6,3,4,3]
link.initList(arr)
link.insert(10,0)
print(link.getItem(0))