单链表
什么是单链表
在单链表中,每个节点由两部分组成,一个数据域,用来存放结点的内容,另一个是指针域,用来存放结点的后继的地址(位置)。
单链表的运算
建表
以下是无头结点
1. 尾插法建表
尾插法顾名思义就是在链表的尾部插入元素,如果只有head指针,每插入一个元素都要遍历一次,效率很低,所以要加入rear指针,始终指向尾部。
2. 头插法建表
头插法顾名思义就是在链表的首部插入元素,因为有head指针,所以直接在首部插入,时间复杂度O(1),效率很高。
表长
这个很好理解,就是算出链表中有多少个元素,遍历时计数,就可以求出表长
按序号查找
链表开始部分沿着指针链向后顺序查找,一直搜索到第i个点为止
插入
步骤:
- 在链表中找到插入位置,这可通过按序号查找来实现
- 生成一个以x为值的新结点
- 将新结点插入
删除
- 找到第 i 个结点
- 删除该结点
相关代码
class Node: # 创建一个链表的结构
def __init__(self,x):
self.data = x
self.next = None
class List:
def __init__(self):
self.head = None
def RearInsert(self,array): # 尾插法
self.head = Node(array[0])
pTmp = self.head
for i in range(1,len(array)):
p = Node(array[i])
pTmp.next = p
pTmp = pTmp.next
def HeadInsert(self,array): # 头插法
self.head = Node(array[0])
for i in range(1,len(array)):
p = Node(array[i])
p.next = self.head
self.head = p
def ListLength(self): # 表长
i = 0
pTmp = self.head
while pTmp:
pTmp = pTmp.next
i += 1
return i
def search(self,num): # 按序号查找元素
i = 0
pTmp = self.head
while pTmp:
if i == num - 1:
return pTmp.data
pTmp = pTmp.next
i += 1
def Insert(self,i,data): # 按序号插入元素
pTmp = self.head
for k in range(i-1):
pTmpl = pTmp.next
pTmpr = pTmpl.next
pTmpl.next = Node(data)
pTmpl.next.next = pTmpr
def Delete(self,i): # 按序号删除元素
pTmp = self.head
for k in range(i-1):
pTmpl = pTmp.next
pTmp = pTmpl.next
pTmpr = pTmpl.next.next
pTmpl.next = pTmpr
del pTmp
《数据结构教程与题解》清华大学出版社