#链表实现
class SingleNode(object):
'''单链表的结点'''
def __init__(self,data):
#item存放数据元素
self.data=data
#next是下一个节点的指针
self.next=None
class SingleLinkList(object):
'''单链表'''
def __init__(self):
#创建头结点,并赋值给head头指针
self.__head=None
def is_empty(self):
'''判断链表是否为空'''
return self.__head==None
def add(self,data):
'''头部添加元素'''
#先创建一个保存data值的结点
node=SingleNode(data)
#将新节点的链接域next指向头结点,即__head指向的位置
node.next=self.__head
#将链表的头__head指向新节点
self.__head=node
def append(self,data):
"""尾部添加元素"""
node=SingleNode(data)
#先判断链表是否为空,若是空链表,则将__head指向新节点
if self.is_empty():
self.__head=node
#若不为空,则找到尾部,将尾结点的next指向新节点
else:
rear=self.__head #尾指针初始化
while rear.next !=None:
rear=rear.next
rear.next=node
def create_add(self,A):
'''以数组为基础,头插法创建链表,头插法产生的链表元素顺序与数组相反'''
for i in range(len(A)):
#先创建一个保存item值的结点
node=SingleNode(A[i])
#将新节点的链接域next指向头结点,即__head指向的位置
node.next=self.__head
#将链表的头__head指向新节点
self.__head=node
def create_append(self,A):
'''以数组为基础,尾插法创建链表,尾插法产生的链表元素顺序与数组相同'''
for i in range(len(A)):
node=SingleNode(A[i])
#先判断链表是否为空,若是空链表,则将__head指向新节点
if self.is_empty():
self.__head=node
#若不为空,则找到尾部,将尾结点的next指向新节点
else:
rear=self.__head
while rear.next !=None:
rear=rear.next
rear.next=node
def length(self):
'''链表长度'''
#p工作指针初始时指向头结点
p=self.__head
count=0
#尾结点指向None,当未到达尾部时
while p!=None:
count+=1
#将cur后移一个结点
p=p.next
return count
def travel(self):
'''遍历链表'''
#工作指针p初始化
p=self.__head
while p!=None:
print(p.data)
p=p.next
print("")
def insert(self,pos,data):
'''指定位置添加元素'''
#若指定位置pos为第一个元素之前,则执行头部插入
if pos<=0:
self.add(data)
#若指定位置超过链表尾部,则执行尾部插入
elif pos>(self.length()-1):
self.append(data)
#找到指定位置
else:
node=SingleNode(data)
count=0
#pre用来指向指定位置pos的前一个位置pos-1,初始从头结点开始移动到指定位置
pre=self.__head
while count<(pos-1):
count+=1
pre=pre.next
#先将新节点的node的next指向插入位置的结点
node.next=pre.next
#将插入位置的前一个结点的next指向新节点
pre.next=node
def remove(self,data):
'''删除节点'''
p=self.__head
pre=None
while p != None:
#找到指定元素
if p.data==data:
#如果第一个就是删除的节点
if not pre:
#将头指针指向头结点的后一个结点
self.__head==p.next
else:
#将删除位置前一个结点的next指向删除位置的后一个结点
pre.next=p.next
break
else:
# 继续按链表后移节点
pre = p
p = p.next
def search(self, data):
"""链表查找节点是否存在,并返回True或者False"""
p = self.__head
while p != None:
if p.data == data:
return True
p = p.next
return False
if __name__ == "__main__":
w = SingleLinkList()
w.add(1)
w.add(2)
w.append(3)
w.insert(2, 4)
print("length:",w.length())
w.travel()
print(w.search(3))
print(w.search(5))
w.remove(1)
print ("length:",w.length())
w.travel()
数据结构——链表实现
最新推荐文章于 2024-07-22 19:36:52 发布