本文不涉及链表概念的详细讲解,而着重利用 python 实现链表,在其中穿插代码讲解。本文主要实现单向链表、单向循环链表、双向链表。
目录
链表有多个节点,第一个节点称为头节点,最后一个节点称为尾节点。中间节点的前一个节点称为前驱节点,后一个节点称为后继节点。每个链表都有一个 head
指针,指向这个链表的头节点。链表可以获取其长度,也可以增加或删除节点,遍历节点。
节点
链表有若干个节点串联而成。对于单向链表而言,每个节点有两个区域,分别存放数据和后继节点。
class Node():
"""节点,保存数据和后继节点"""
def __init__(self, elem):
self.elem = elem
self.next = None
在双向链表中,每个节点不仅指向后继节点,还可以指向前驱节点,因此节点中还有有个区域存放前驱节点。
class Node():
"""双向链表节点"""
def __init__(self, item):
self.elem = item
self.next = None
self.pre = None
单向链表
单向链表只能从第一个节点开始向后搜索,直到最后一个结点。
构造链表
每个链表均有一个 head
值指向头节点;如果是空链表,则指向 None
。
class Linklist():
def __init__(self, node=None):
self.__head = node
是否为空
如果 head
值指向 None
,则说明是个空链表。
def is_empty(self):
"""判断链表是否为空"""
return self.__head == None
遍历链表
指针 cur
从指向头节点开始,沿着每个节点的 next
值指向后继节点,直至尾节点 next
指向 None
。
def travel(self):
"""遍历链表"""
cur = self.__head
while cur != None:
print(cur.elem)
cur = cur.next
获取长度
要知道链表的长度就要遍历一遍链表,并记录下节点个数。
def length(self):
"""返回链表长度"""
cur = self.__head
count = 0
while cur != None:
count += 1
cur = cur.next
return count
插入元素
尾部插入
在尾部插入新的节点,只需要把最后一个节点的 next
区域改为新插入的节点,新插入节点的 next
区域指向 None
。
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
这里只需要传入值,在函数内构造节点。
头部插入
要在链表头部添加元素,则需要让 head
指向这个新节点,让新节点的 next
指向原有的头节点。
def add(self, item):
"""在链表头部添加"""
node = Node(item)
node.next