python实现单链表
链表的定义:
链表(linked list)是由一组被称为结点的数据元素组成的数据结构,每个结点都包含结点本身的信息和指向下一个结点的地址。由于每个结点都包含了可以链接起来的地址信息,所以用一个变量就能够访问整个结点序列。也就是说,结点包含两部分信息:一部分用于存储数据元素的值,称为信息域;另一部分用于存储下一个数据元素地址的指针,称为指针域。链表中的第一个结点的地址存储在一个单独的结点中,称为头结点或首结点。链表中的最后一个结点没有后继元素,其指针域为空。
如下图所示:
class Node(object):
def __init__(self, elem):
self.elem = elem
self.next = None
class SingleLinkList(object):
def __init__(self, node=None):
self._head = node
def is_empty(self):
"""判断链表是否为空"""
return self._head == None
def length(self):
"""链表长度"""
# cur 游标,用来移动遍历节点
cur = self._head
# 记录数量
count = 0
while cur != None:
count += 1
cur = cur.next
return count
def traver(self):
"""遍历整个列表"""
cur = self._head
while cur != None:
print(cur.elem)
cur = cur.next
print("")
def add(self, item):
"""链表头部添加元素"""
node = Node(item)
node.next = self._head
self._head = node
cur = self._head
def append(self, item):
"""链表尾部添加元素"""
node = Node(item)
if self.is_empty():
self._head = node
else:
cur = self._head
while cur.next != None:
cur = cur.next
cur.next = node
def insert(self, pos, item):
"""指定位置添加元素"""
if pos < 0:
self.add(item)
elif pos > (self.length() - 1):
self.append(item)
else:
node = Node(item)
pre = self._head
count = 0
while count < (pos - 1):
count += 1
cur = pre.next
# 当循环推出后pre指向 pos-1
node.next = pre.next
pre.next = node
def remove(self, item):
"""删除节点"""
cur = self._head
pre = None
while cur != None:
if cur.elem == item:
# 先判断此节点是否是头节点
if cur == self._head:
self._head = cur.next
else:
pre.next = cur.next
break
else:
pre = cur
cur = cur.next
return None
def search(self, item):
"""查找节点是否存在"""
cur = self._head
while cur != None:
if cur.elem == item:
return True
else:
cur = cur.next
if __name__ == '__main__':
ll = SingleLinkList()