python实现单链表,后续会不断更新。
参考资料:《数据结构与算法——Python原因描述》-- 裘宗燕
单链表结构示意图:
代码实现:
# -*- coding: utf-8 -*-
"""
Created on 2019.9.21
author: 双皮奶
"""
class LNode():
"""结点类"""
def __init__(self, elem, next_=None): #存放元素数据
self.elem = elem #next是下一个节点的标识
self.next = next_
class Single_LinkList():
def __init__(self): # 头节点定义为私有变量
self._head = None
def is_empty(self): # 判断链表是否为空
return self._head is None
def length(self): # 输出表的长度
p = self._head
n = 0 # 计数
while p is not None:
n += 1
p = p.next
return n
def prepend(self, elem): # 在表头插入数据
self._head = LNode(elem, self._head)
def pop(self): # 删除表头结点并返回这个结点里的数据
if self._head is None: # 判断表是否为空
print("表为空!")
return
e = self._head.elem # 获取结点数据
self._head = self._head.next # 删除结点
return e
def append(self, elem): # 在尾部添加一个节点
if self._head is None: # 判断表是否为空
self._head = LNode(elem)
return
p = self._head
while p.next is not None: # 定位到表尾
p = p.next
p.next = LNode(elem)
def pop_last(self): # 删除表中最后的元素
if self._head is None: # 判断表是否为空
print("表为空!")
return
p = self._head
if p.next is None: # 表中只有一个元素
e = p.elem
self._head = None
return e
while p.next.next is not None: # 定位倒数第二个元素
p = p.next
e = p.next.elem
p.next = None
return e
def insert(self, pos, elem): # 在指定位置插入结点
if pos < 0 or pos > self.length(): # 位置超出范围
print('位置超出范围')
return
if pos == 0: # 表头插入
self.prepend(elem)
elif pos == self.length(): # 尾部插入
self.append(elem)
else: # 找到指定位置
p = self._head
n = 0
e = LNode(elem)
while n < (pos-1):
n += 1
p = p.next
e.next = p.next # 先将新结点的next指向插入位置的结点
# 将插入位置的前一个节点的next指向新节点
p.next = e
def delete(self, pos): # 删除指定位置的结点
if pos < 0 or pos >= self.length(): # 位置超出范围
print('位置超出范围')
return
if pos == 0: # 删除第一个元素
self.pop()
elif pos == self.length() - 1: # 删除最后一个元素
self.pop_last()
else: # 找到指定位置
p = self._head
n = 0
while n < (pos-1):
n += 1
p = p.next
p.next = p.next.next
def printall(self): # 输出链表内容
p = self._head
while p is not None:
print(p.elem, end='')
if p.next is not None:
print(', ', end='')
p = p.next
print('') # 换行
def clear(self): # 删除链表
self._head = None