双向链表
相对于单项列表,双向链表数据区前多加一个链接区,指向前一个结点。
链表的数据添加时,区别与单链表差别不是很大,需注意p区的指向。
链表查找时完全可以当作单链表按顺序查找。
单项循环链表
其与双向链表的区别就是最后的next指向第一个节点
各项操作:
class xunhuanLinkList(object):
def __init__(self,elem):
self.elem=elem
self.next=None
#"单链表"
def __init__(self,node=None):
"头节点"
self.__head=node
def is_empty(self):
'''没有添加新的变量就直接用self'''
"验证是否为空列表"
return self.__head == None
def length(self):
"链表长度"
#游标cur,遍历节点使用
if self.is_empty():
return 0
cur=self.__head
#count 记录数量
count=1
while cur.next!=self.__head:#单链表的区别:while cur!=None:
count +=1
cur=cur.next
return count
def travel(self):
"遍历列表"
if self.is_empty():
return
cur=self.__head
while cur.next!=self.__head:
print(cur.elem,end=" ")
cur=cur.next
print(cur.elem)
print("")
def add(self,item):
"头插法"
node = Node(item)
if self.is_empty():
self.__head=node
node.next=node
else:
cur = self.__head
while cur.next != self.__head:
cur = cur.next
node.next = self.__head
self.head = node
cur.next = node
def append(self,item):
"尾插法"
node=Node(item)
cur=self.__head
while cur.next!=self.__head:
cur=cur.next
node.next=self.__head
cur.next=node
def index(self,pos,item):
if pos<=0:
self.add(item)
elif pos>(self.length()-1):
self.append(item)
else:
pre=self.__head
count=0
while count <pos-1:
count+=1
pre=pre.next
node=Node(item)
node.next=pre.next
pre.next=node
def remove(self,item):
if self.is_empty():
return
cur=self.__head
pre=None
while cur.next!=self.__head:
if cur.elem==item:
#先判断节点是否为头节点
if cur==self.__head:
# 头结点的情况找尾节点
rear=self.__head
while rear.next!=self.head:
rear=rear.next
self.__head=cur.next
rear.next=self.__head
else:
pre.next=cur.next
return
else:
pre=cur
cur=cur.next
if cur.elem==item:
if cur==self.__head:
self.__head=None
else:
pre.next=self.__head
def search(self,item):
cur=self.__head
if self.is_empty():
return False
while cur!=self.__head:
if cur.elem==item:
return True
else:
cur=cur.next
if cur.elem==item:
return True
return False