Python-链表-浅谈
结构脉络:
非顺序存储结构,由一系列节点组成
每个节点由数据域与指针域构成
数据域存储数据元素,指针域存储下一节点指针
分单链表,双链表,循环链表
(循环链表亦分单循环与双循环)
python实现
1.定义节点
数据元素:item
指针:next
class Node(object):
'''单链表'''
def __init__(self,item):
self.item = item
self.next = None
2.定义链表
head:首地址指针
class SingleLinkList(object):
'''单链表'''
def __init__(self):
self._head = None
if __name__ == '__main__':
link_list = SingleLinkList()
node1 = Node(1)
node2 = Node(2)
link_list._head = node1
node1.next = node2
print(link_list._head.item)
print(link_list._head.next.item)
其实python有内置分装好的链表数据结构及其方法,不必每次用时自己定义,这样展示近是为了告诉我们,无论是python 还是C++/Java,都仅是语言,机器不明白什么是链表,也不明白什么是算法,仅知道按步执行而已,数据结构与算法是人们想出来的一种计算方法,而语言只是按照人们预设好的逻辑去描述那些方法,初学者不要被困在语言上,想清楚自己要做什么,弄清楚那些前辈们总结好的数据结构,将自己要做的事用某种语言描述出来,描述清楚,当机器明白它需要做什么时,我们的目的便达到了
链表中的操作方法
(单链表)
is_empty() #链表是否为空
length() #链表长度
items() #获取链表数据迭代器
add(item) #链表头部添加元素
append(item) #链表尾部添加元素
insert(pos,item) #指定位置添加元素
remove(item) #删除节点
find(item) #查找节点是否存在
具体实现代码(实际使用中可直接调用上述方法)
class SingleLinkList(object):
def __init__(self):
self._head = None
def is_empty(self):
return self._head is None
def length(self):
cur = self._head
count = 0
while cur is not None:
count += 1
cur = cur.next
return count
def items(self):
'''遍历链表'''
cur = self._head
while cur is not None:
yield cur.item
cur = cur.next
def add(self, item):
node = Node(item)
node.next = self._head
self._head = node
'''
链表的添加和换女朋友一样
newnode先处理后面,再连接前面
'''
def append(self, item):
node = Node(item)
if self.is_empty():
self._head = node
else:
cur = self._head
while cur.next is not None:
cur = cur.next
cur.next = node
cur.next = node
# 这一段是在找最后一个节点,单链表就这一点不好,找哪个都要从头遍历
def insert(self, index, item):
if index <= 0:
self.add(item)
elif index > (self.length() - 1):
self.append(item)
else:
node = Node(item)
cur = self._head
for i in range(index -1):
cur = cur.next
node.next = cur.next
cur.next = node
#先考虑特殊情况,再处理普通情况
def remove(self, item):
cur = self._head
pre = None
while cur is not None:
if cur.item == item:
if not None:
self._head = cur.next
else:
pre.next = cur.next
return True
else:
pre = cur
cur = cur.next
def find(self, item):
return item in self.items()
# 返回True or False
操作链表:
if __name__ == '__main__':
link_list = SingleLinkList()
for i in range(5):
link_list.append(i)
link_list.add(6)
for i in link_list.items():
print(i, end='\t')
link_list.insert(3, 9)
print('\n', list(link_list.items()))
link_list.remove(0)
print(link_list.find(4))
#自己运行试试看,看看输出的与自己推算的是否一致
循环链表与上面的单链表逻辑一致,只是要多考虑最后一个元素节点的next指向head节点
双链表的定义,Node 类里增加一个
self.prev = None
其余实现逻辑也是由单链表衍生出来的,调用的方法名都是一样的,只是方法内部的实现上有些许差异,实际应用中只需要会调用即可,但是若能仿照上面单链表把其他实现细节自己写一遍会更好