单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域,用来存储数据,一个是链接域,这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值。
image.png
- 表元素elem 用来存放数据
- 链接域next用来存放下一个节点的位置(python 中的标识)
- 变量p指向链表的头节点的位置,从p出发能到链表的任意节点。
节点实现:
class Node(object):
def __init__(self,elem):
self.elem = elem
self.next = None
单链表的操作:
- is_empty()链表是否为空
- length() 链表长度
- trave() 遍历整个链表
- add(item) 在链表头部添加元素
- append(item) 在链表尾部添加元素
- insert(pos, item) 在链表pos位置添加元素
- remove(item) 删除元素
- search(item) 查找元素
单链表的实现
class SingleLinkList(object):
def __init__():
self.__head = None
def is_empty(self):
return self.__head == None
def length(self):
cur = self.__head
count = 0
while cur != None:
count += 1
cur = cur.next
return count
def travel():
cur = self.__head
while cur != None:
print(cur.elem,end = " ")
cur = cur.next
头部添加元素
image.pngdef add(item):
node = Node(item):
node.next = self.__head
self.__head = node
尾部添加元素
def append(item)
node = Node(item)
cur = self.__head
if self.is__empty():
self.__head = node
else:
while cur != None:
cur = cur.next
cur.next = node
指定位置添加元素
image.pngdef insert(self, pos, item):
if pos <= 0:
self.add(item)
elif pos >= self.length():
self.append(item)
else:
node = Node(item)
pre = self.__head
count = 0
while count < (pos-1):
count += 1
pre = pre.next
node.next = pre.next
pre.next = node
删除节点
image.pngdef remove(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
def search(item):
cur = self.__head
while cur != None:
if cur.elem == item:
return True
else:
cur = cur.next
return False
链表与顺序表的对比
- 链表失去了顺序表随机读取的优点
- 链表增加了节点的指针域,空间开销比较大
- 链表对存储空间的使用要相对灵活
- 链表的主要耗时工作是遍历,删除和插入操作本身的复杂度是O(1)
- 顺序表查找很快,主要耗时操作是拷贝覆盖,除了目标元素在尾部的特殊情况,顺序表在进行插入和删除时需要对操作点之后的所有元素进行前后以为操作。
链表与顺序表的各种操作复杂度对比:
image.png
网友评论