数据结构与算法之链表Linked List
线性数据结构(linear data structure)第四讲链表(linked list)
链表:有顺序关系的一组元素[1]。
链表的操作:
LinkedList()
创建一个新链表,返回空的链表。add(item)
将item添加到链表头部,返回None。append(item)
将item添加到链表尾部,返回None。insert(pos, item)
在pos位置添加元素item,返回None。remove(item)
从链表中删除第一个item元素,返回被删除的元素。pop(pos)
从链表中删除pos位置上的元素,返回被删除的元素。pos默认为链表最后的位置。index(item)
返回item在链表中的索引。没有找到时返回-1。is_empty()
判断链表是否为空,返回True或者False。size()
返回链表中元素个数。
链表的实现[2]:
class Node:
def __init__(self, value):
self.value = value
self.next = None
class LinkedList:
def __init__(self):
self.head = None
def add(self, item):
new_node = Node(item)
new_node.next = self.head
self.head = new_node
def append(self, item):
current = self.head
pre = None
while current != None:
pre = current
current = current.next
node = Node(item)
if pre == None:
self.head = node
else:
pre.next = node
def index(self, item):
current = self.head
count = 0
while current != None:
if current.value == item:
return count
current = current.next
count += 1
return -1
def is_empty(self):
return self.head == None
def size(self):
current = self.head
count = 0
while current != None:
count += 1
current = current.next
return count
链表的优点:
- 在链表头部和尾部的操作快,适合实现堆和队列。
链表的缺点:
- 查找速度慢,需要遍历[3]。
参考资料:
- Problem Solving with Algorithms and Data Structures - Chapter 3
- Data Structures Reference - For coding interviews or computer science classes
注[1]: 其实我也不知道怎么描述。链表还有有序链表,链表中的元素按照大小顺序排列;双向链表,链表中的每个节点可以有前后两个节点。
注[2]: 实际如果使用到,我想我应该想直接用Python的list。
注[3]: 如果是有序链表,在查找时可以使用二分查找加快查找速度,但是同样的在向有序链表中添加数据时相比较普通链表会花费更多时间。