链表是一种数据线性排列的数据结构,由一系列结点构成,结点包括数据域和指针域两部分。数据域主要用于保存结点数据信息,指针域则是存储下一个结点数据的内存地址。链表在内存中可以分散存储,存储空间不必连续。
对于单链表的访问只能从头结点开始,顺序访问,时间复杂度是O(n)。增加和删除结点只需要修改指针域即可,时间复杂度可达到O(1)。
示例程序:
# -*- coding: utf-8 -*-
"""
Created on Thu Jul 25 16:38:36 2019
@author: cc
"""
#python实现单链表
#结点嵌套形式,内存浪费?
#结点类
class SingleLink():
def __init__(self,data):
self.data=data
self.next=None
#链域类
class Operation():
#初始化头节点
def __init__(self,sg_link=None):
self._head=sg_link
'''链表是否为空'''
def is_empty(self):
return self._head==None
'''链表长度'''
def length(self):
count=0
cur=self._head
if cur==None:
print("空链表")
else:
while cur!=None:
count+=1
cur=cur.next
return count
'''遍历整个链表'''
def traverse(self):
cur=self._head
if cur==None:
print("空链表")
else:
while cur!=None:
print(cur.data,end=' ')
cur=cur.next
print('\n')
'''链表尾部添加元素'''
def append_node(self,elem):
singlelink=SingleLink(elem)
if self.is_empty():
self._head=singlelink
else:
cur=self._head
while cur.next!=None:
cur=cur.next
cur.next=singlelink
'''链表头部添加元素'''
def head_insert(self,elem):
singlelink=SingleLink(elem)
singlelink.next=self._head
self._head=singlelink
'''指定位置添加元素'''
def insert(self,pos,elem):
singlelink=SingleLink(elem)
cur=self._head
while pos-1:
cur=cur.next
singlelink.next=cur.next
cur.next=singlelink
'''删除指定位置元素'''
def remove(self,pos):
pre=None
cur=self._head
while not pos-2:
cur=cur.next
pre=cur.next
cur.next=pre.next
'''查找结点是否存在'''
def search(self,elem):
cur=self._head
if cur.data==elem:
print("Find")
else:
cur=cur.next
return False
print("Not find")
if __name__ =="__main__":
#头插法
#声明尾指针
sglink=Operation()
print(sglink.is_empty())
print(sglink.length())
sglink.append_node(10)
sglink.head_insert(15)
sglink.insert(1,8)
print(sglink.is_empty())
print(sglink.length())
sglink.traverse()
sglink.remove(1)
sglink.traverse()
sglink.search(15)
测试结果:
True
空链表
0
False
3
15 8 10
15 10
Find