定义了单向链表的结点类,单向链表类及其一些方法,以及有一些测试
class node(object):
def __init__(self,value):
self.item=value
self.next=None
#链表的处理完整性考虑顺序:
# 一般结点(中间点),空链表,头结点,单个节点的头结点,尾结点,单个结点的尾结点。
# [单个节点既可以被看成头结点也可以看成尾结点]
# (明显例子:单向循环链表的remove)
class singlelinklist(object):
def __init__(self,node=None):
self.__head=node
def isempty(self):
'''判断链表是否为空'''
return self.__head==None#用is None会好一点,编译器不会下划线警告
def len(self):
'''返回链表长度'''
'''指针遍历计数'''
count=0
cur=self.__head
while cur!=None:
count+=1
cur=cur.next
return count
def travel(self):
cur=self.__head
while cur!=None:
print(cur.item,end=" ")
cur=cur.next
print()
def append(self,value):
'''尾部添加结点'''
newnode=node(value)
cur=self.__head
if self.isempty():
self.__head=newnode
else:
while cur.next!=None:
cur=cur.next
cur.next=newnode
def add(self,value):
'''头部添加结点'''
newnode=node(value)
newnode.next=self.__head
self.__head=newnode
def insert(self,index,value):
'''指定位置插入节点'''
newnode=node(value)
n=self.len()
if index<=0:
self.add(value)
return
if index>n-1:
self.append(value)
return
cur=self.__head
count=0
while count<index-1:
count+=1
cur=cur.next
newnode.next=cur.next
cur.next = newnode
def remove(self, value):
'''删除左边第一个与指定值相同的结点'''
cur = self.__head
pre = None
while cur!=None:#空链表直接不执行
if cur.item==value:
if cur==self.__head:#头结点,包括了单一头结点
self.__head=cur.next
break
else:
pre.next=cur.next
break
else:
pre=cur
cur=cur.next
def search(self,value):
'''查找某结点是否在链表中,返回TRUE/False'''
cur=self.__head
while cur!=None:
if cur.item==value:
return True
cur = cur.next
return False
def found(self,value):
'''找到指定元素的下标(实际链表无下标)'''
cur = self.__head
count=0
while cur!=None:
if cur.item == value:
return count
cur = cur.next
count += 1
if __name__=='__main__':
ll=singlelinklist()
print(ll.isempty())
print(ll.len())
ll.append(1)
print(ll.isempty())
print(ll.len())
ll.append(2)
ll.add(8)
ll.append(3)
ll.append(4)
ll.append(5)
ll.append(6)#8 1 2 3 4 5 6
ll.travel()
ll.insert(-1,9)#9 8 1 2 3 4 5 6
ll.travel()
ll.insert(3, 100)# 9 8 1 100 2 3 4 5 6
ll.travel()
ll.insert(10, 200) # 9 8 1 100 2 3 4 5 6 200
ll.travel()
ll.remove(100)# 9 8 1 2 3 4 5 6 200
ll.travel()
ll.remove(9)# 8 1 100 2 3 4 5 6 200
ll.travel()
ll.remove(200)# 8 1 2 3 4 5 6
ll.travel()
print(ll.search(55)) # False
print(ll.search(5)) # True
print(ll.found(5)) # 5
测试结果