链表由节点和有向链构成。因此我们可以生成两个类:节点类和单向链表操作类。
节点类:
节点类用于构建单链表的节点,一个节点包含两个部分:值和指向。(假设节点类不具有指向性,因此next的参数默认为None)
class Node:
def __init__(self, val, next=None):
self.val = val #将val传入的值赋给self.val
self.next = next #next始终为None,不具备指向性,在实例化时进行指向
下面进行实例化举例:
创建node1(val=1),node2(val=2),并将node1指向node2。
node1 = Node(1) # ①
node2 = Node(2) # ②
node1.next = node2 # ③
单向链表类:
在创建单链表类,我们要首先创建一个头节点,这个头节点仅代表一个链表的开始,故不需要赋值。
1、创建头节点:
class LinkList:
def __init__(self):
self.head = Node(None) # 通过之前的Node类创建一个链表的头结点
下面进行实例化举例:
创建一个包含头结点和一个节点的单链表。
思路:首先生成一个头节点,一个节点,再将头节点指向节点。
l = LinkList() # 用l将linklist实例化,之后l就具有了linklist所具有的属性
node = Node(1) # 生成节点
l.head.next = node # l.head就是生成的头节点:Node(none),图中用node_head表示
# .next表示将头节点指向node
由上图,如何通过头结点找到node? ——l.head.next 如何访问node的值?——l.head.next.val
2、将列表转换为链表:
思路:通过访问列表,对每一个列表里的值循环进行添加节点即可。我们引入临时变量p代表当前到达的节点。一开始p在头节点处,为头结点添加node1,之后p移动到node1,为node1添加node2,之后p移动到node2,为node2添加node3.........直到将列表的元素全部添加完。
# 将列表转换为链表
def init_list(self, list_):
p = self.head # 将头节点赋给p
for item in list_: # 循环遍历列表
p.next = Node(item) # 将下一个节点添加在当前节点(p)之后
p = p.next # 将p移动到下一个节点
3、遍历链表并返回值
# 遍历列表并返回值
def show(self):
p = self.head.next
while p is not None:
print(p.val)
p = p.next
4、清除全部链表
思路:直接将头节点的next置为None即可。python会将剩下的数据自己清理掉。
# 清空全部链表
def clear(self):
self.head.next = None
5、检查是否为空
# 检查链表是否为空
def is_empty(self):
if self.head.next is None:
return True
else:
return False
6、插入
①尾插法:
思路:将p遍历到最后一个节点,在最后一个节点之后添加一个node
# 在链表末尾插入一个节点
def append(self, val):
p = self.head
while p.next is not None:
p = p.next
p.next = Node(val)
②头插法:
思路:将要插入的节点的next指向头节点的下一个节点,将头节点的next指向该节点。
def head_insert(self, val):
node = Node(val) # ①
node.next = self.head.next # ②
self.head.next = node # ③
③随意插入法:
思路:引入临时变量p表示当前节点位置。将p移动到index-1的位置,采用和头插法相同的思路插入。
# 在index处插入节点
def insert(self, index, val):
p = self.head
for i in range(index):
if p.next is None:
break
p = p.next
node = Node(val)
node.next = p.next
p.next = node
7、传入节点位置并获取相应值
def get_index(self, index):
p = self.head.next
for i in range(index):
if p.next is None:
raise IndexError("list index is out of range")
p = p.next
return p.val
8、删除节点操作(按值删除)
def delete(self, x):
p = self.head
while p.next and p.next.val != x:
p = p.next
if p.next is None:
raise ValueError("x is not found")
else:
p.next = p.next.next