链表
链表是链式的存储多个元素
.
但不同于列表
,
链表中的元素在内存中不必是连续的空间
链表的每个元素由一个存储元素本身的节点和一个指向下一个元素的引用
(
有些语言称为指针
或者链接
)
组成
链表访问任何一个位置的元素时
,
都需要从头开始访问
.(
无法跳过第一个元素访问任何一个元
素
)
链表常见的操作
append(element)
:向列表尾部添加一个新的项
insert(position, element)
:向列表的特定位置插入一个新的项。
remove(element)
:从列表中移除一项。
indexOf(element)
:返回元素在链表中的索引。如果列表中没有该元素则返回
-1
。
removeAt(position)
:从列表的特定位置移除一项。
isEmpty()
:如果链表中不包含任何元素,返回
true
,如果链表长度大于
0
则返回
false
。
size()
:返回链表包含的元素个数。与数组的
length
属性类似。
单向链表
:
只能从头遍历到尾或者从尾遍历到头
(
一般从头到尾
)
也就是链表相连的过程是单向的
.
实现的原理是上一个链表中有一个指向下一个的引用
.
单向链表有一个比较明显的缺点
:
我们可以轻松的到达下一个节点
,
但是回到前一个节点是很难的
.
单向链表的实现
# 创建节点类,用于存放每个节点信息
class Node():
def __init__(self, el):
self.el = el
self.next = None
# 创建链表类
class LinkedList():
# 链表的类 初始化数据个数和头部节点
def __init__(self):
self.length = 0
self.head = None
# 根据元素获取链表中的位置
def indexof(self, el):
# 定义变量, 保存信息
current = self.head
index = 0
# 找到元素所在的位置
while (current != None):
if (current.el == el):
return index
index += 1
current = current.next
return -1 # 来到这个位置, 说明没有找到, 则返回-1
# 给链表尾部追加元素
def append(self, el):
# 根据传入的数据创建新节点
newNode = Node(el)
# 如果是空链表直接把头部节点指定为新节点
if (self.head == None):
self.head = newNode
# 链表不为空
else:
# 定义变量,保存当前头部节点
current = self.head
# 循环找到链表中最后一个节点
while (current.next != None):
current = current.next
# 把最后一个节点的next设置为新节点
current.next = newNode
self.length += 1 # 增加链表长度
# 根据下标插入节点
def insert(self, position, element):
# 检测越界问题: 越界插入失败
if (position < 0 or position > self.length):
return False
# 定义变量, 保存信息
newNode = Node(element)
current = self.head
previous = None
index = 0
if (position == 0):
newNode.next = current
self.head = newNode
else:
while (index < position):
previous = current
current = current.next
index += 1
newNode.next = current
previous.next = newNode
self.length += 1
return True
def removeAt(self, position):
# 检测越界问题: 越界移除失败, 返回None
if (position < 0 or position >= self.length):
return None
# 定义变量, 保存信息
current = self.head
previous = None
index = 0
# 判断是否是移除第一项
if (position == 0):
self.head = current.next
else:
while (index < position):
previous = current
current = current.next
index += 1
previous.next = current.next
self.length -= 1
return current.el
# 根据元素删除信息
def remove(self, el):
index = self.indexof(el)
return self.removeAt(index)
# 判断链表是否为空
def isEmpty(self):
return self.length == 0
# 获取链表的长度
def size(self):
return self.length
list1 = LinkedList()
for i in range(6):
list1.append(i)
print(list1.indexof("hello")) # -1
print(list1.indexof(4)) # 4
print(list1.remove(4)) # 4
print(list1.size()) # 5