循环双链表:就是将双链表中最后一个结点的后继指针指向双链表的头结点,并将其头结点的先驱指针指向表中最后一个结点。
python实现
创建循环双链表
class DoubleLinkedNode:
def __init__(self,data):
self.data = data
self.next = None
self.prev = None
class CircularDoubleLinkedList:
def __init__(self):
self.head = DoubleLinkedNode(None)
'''创建循环双链表'''
def CreatCircularDoubleLinkedList(self):
data = input("请输入数据(按回车键确定,按“#”结束):")
cNode = self.head
while data != "#":
nNode = DoubleLinkedNode(int(data))
cNode.next = nNode
nNode.prev = cNode
nNode.next = self.head
self.head.prev = nNode
cNode = cNode.next
data = input("请输入数据(按回车键确定,按“#”结束):")
CDLList = CircularDoubleLinkedList()
CDLList.CreatCircularDoubleLinkedList()
结果如下:
获取循环双链表长度
class DoubleLinkedNode:
def __init__(self,data):
self.data = data
self.next = None
self.prev = None
class CircularDoubleLinkedList:
def __init__(self):
self.head = DoubleLinkedNode(None)
'''创建循环双链表'''
def CreatCircularDoubleLinkedList(self):
data = input("请输入数据(按回车键确定,按“#”结束):")
cNode = self.head
while data != "#":
nNode = DoubleLinkedNode(int(data))
cNode.next = nNode
nNode.prev = cNode
nNode.next = self.head
self.head.prev = nNode
cNode = cNode.next
data = input("请输入数据(按回车键确定,按“#”结束):")
'''获取循环双链表长度'''
def GetLength(self):
cNode = self.head
i = 0
while cNode.next != self.head:
i += 1
cNode = cNode.next
print(i)
CDLList = CircularDoubleLinkedList()
CDLList.CreatCircularDoubleLinkedList()
CDLList.GetLength()
结果如下:
判断循环双链表是否为空
class DoubleLinkedNode:
def __init__(self,data):
self.data = data
self.next = None
self.prev = None
class CircularDoubleLinkedList:
def __init__(self):
self.head = DoubleLinkedNode(None)
'''创建循环双链表'''
def CreatCircularDoubleLinkedList(self):
data = input("请输入数据(按回车键确定,按“#”结束):")
cNode = self.head
while data != "#":
nNode = DoubleLinkedNode(int(data))
cNode.next = nNode
nNode.prev = cNode
nNode.next = self.head
self.head.prev = nNode
cNode = cNode.next
data = input("请输入数据(按回车键确定,按“#”结束):")
'''获取循环双链表长度'''
def GetLength(self):
cNode = self.head
i = 0
while cNode.next != self.head and cNode.next != None:
i += 1
cNode = cNode.next
return i
'''判断是否为空'''
def IsEmpty(self):
if self.GetLength() == 0:
return True
else:
return False
CDLList = CircularDoubleLinkedList()
CDLList.CreatCircularDoubleLinkedList()
CDLList.IsEmpty()
结果如下:
在表中尾端插入某一个结点
class DoubleLinkedNode:
def __init__(self,data):
self.data = data
self.next = None
self.prev = None
class CircularDoubleLinkedList:
def __init__(self):
self.head = DoubleLinkedNode(None)
'''创建循环双链表'''
def CreatCircularDoubleLinkedList(self):
data = input("请输入数据(按回车键确定,按“#”结束):")
cNode = self.head
while data != "#":
nNode = DoubleLinkedNode(int(data))
cNode.next = nNode
nNode.prev = cNode
nNode.next = self.head
self.head.prev = nNode
cNode = cNode.next
data = input("请输入数据(按回车键确定,按“#”结束):")
'''尾端插入结点'''
def InsertElementInTail(self):
cNode = self.head
key = input("请输入要插入的数据:")
nNode = DoubleLinkedNode(int(key))
while cNode.next!=self.head:
cNode = cNode.next
cNode.next = nNode
nNode.prev = cNode
nNode.next = self.head
self.head.prev = nNode
'''获取循环双链表长度'''
def GetLength(self):
cNode = self.head
i = 0
while cNode.next != self.head:
i += 1
cNode = cNode.next
print(i)
CDLList = CircularDoubleLinkedList()
CDLList.CreatCircularDoubleLinkedList()
CDLList.InsertElementInTail()
CDLList.GetLength()
结果如下:
在表中指定位置插入结点
class DoubleLinkedNode:
def __init__(self,data):
self.data = data
self.next = None
self.prev = None
class CircularDoubleLinkedList:
def __init__(self):
self.head = DoubleLinkedNode(None)
'''创建循环双链表'''
def CreatCircularDoubleLinkedList(self):
data = input("请输入数据(按回车键确定,按“#”结束):")
cNode = self.head
while data != "#":
nNode = DoubleLinkedNode(int(data))
cNode.next = nNode
nNode.prev = cNode
nNode.next = self.head
self.head.prev = nNode
cNode = cNode.next
data = input("请输入数据(按回车键确定,按“#”结束):")
'''在表中指定位置插入结点,输入的位置不是首端,也不是尾端,且有效'''
def InsertElement(self):
index = int(input('请输入要插入的位置:'))
key = int(input("请输入要插入的值:"))
cNode = self.head
pNode = self.head # 前一个结点
pos = 0
while cNode.next != self.head and pos < index:
pNode = cNode
cNode = cNode.next
pos += 1
if index == pos:
qNode = DoubleLinkedNode(key)
pNode.next = qNode
qNode.prev = pNode
qNode.next = cNode
cNode.prev = qNode
def GetLength(self):
cNode = self.head
i = 0
while cNode.next != self.head and cNode.next != None:
i += 1
cNode = cNode.next
print(i)
CDLList = CircularDoubleLinkedList()
CDLList.CreatCircularDoubleLinkedList()
CDLList.InsertElement()
CDLList.GetLength()
结果如下:
在表中首端插入某一个结点
class DoubleLinkedNode:
def __init__(self,data):
self.data = data
self.next = None
self.prev = None
class CircularDoubleLinkedList:
def __init__(self):
self.head = DoubleLinkedNode(None)
'''创建循环双链表'''
def CreatCircularDoubleLinkedList(self):
data = input("请输入数据(按回车键确定,按“#”结束):")
cNode = self.head
while data != "#":
nNode = DoubleLinkedNode(int(data))
cNode.next = nNode
nNode.prev = cNode
nNode.next = self.head
self.head.prev = nNode
cNode = cNode.next
data = input("请输入数据(按回车键确定,按“#”结束):")
'''首端插入结点'''
def InsertElementInHead(self):
cNode = self.head.next
pNode = self.head
key = input("请输入要插入的数据:")
nNode = DoubleLinkedNode(int(key))
pNode.next= nNode
nNode.prev = pNode
nNode.next = cNode
cNode.prev = nNode
'''获取循环双链表长度'''
def GetLength(self):
cNode = self.head
i = 0
while cNode.next != self.head:
i += 1
cNode = cNode.next
print(i)
CDLList = CircularDoubleLinkedList()
CDLList.CreatCircularDoubleLinkedList()
CDLList.InsertElementInHead()
CDLList.GetLength()
结果如下:
删除表中某一结点
class DoubleLinkedNode:
def __init__(self,data):
self.data = data
self.next = None
self.prev = None
class CircularDoubleLinkedList:
def __init__(self):
self.head = DoubleLinkedNode(None)
'''创建循环双链表'''
def CreatCircularDoubleLinkedList(self):
data = input("请输入数据(按回车键确定,按“#”结束):")
cNode = self.head
while data != "#":
nNode = DoubleLinkedNode(int(data))
cNode.next = nNode
nNode.prev = cNode
nNode.next = self.head
self.head.prev = nNode
cNode = cNode.next
data = input("请输入数据(按回车键确定,按“#”结束):")
'''删除指定元素的结点'''
def DeleteElement(self):
cNode = self.head
pNode = self.head
key = int(input("请输入要删除的数据:"))
while cNode.data != key and cNode.next != self.head:
pNode = cNode
cNode = cNode.next
if cNode.data == key:
pNode.next= cNode.next
cNode.next.prev = pNode
del cNode
print("已成功删除含有",key,"的结点")
else:
print("删除失败!")
CDLList = CircularDoubleLinkedList()
CDLList.CreatCircularDoubleLinkedList()
CDLList.DeleteElement()
结果如下:
获取表中指定位置结点的值
class DoubleLinkedNode:
def __init__(self,data):
self.data = data
self.next = None
self.prev = None
class CircularDoubleLinkedList:
def __init__(self):
self.head = DoubleLinkedNode(None)
'''创建循环双链表'''
def CreatCircularDoubleLinkedList(self):
data = input("请输入数据(按回车键确定,按“#”结束):")
cNode = self.head
while data != "#":
nNode = DoubleLinkedNode(int(data))
cNode.next = nNode
nNode.prev = cNode
nNode.next = self.head
self.head.prev = nNode
cNode = cNode.next
data = input("请输入数据(按回车键确定,按“#”结束):")
'''获取表中指定位置结点的值'''
def GetElement(self):
index = int(input('请输入要查找结点的位置:'))
cNode = self.head
pos = 0
while cNode.next != self.head and pos < index:
cNode = cNode.next
pos += 1
if index == pos:
return cNode.data
CDLList = CircularDoubleLinkedList()
CDLList.CreatCircularDoubleLinkedList()
CDLList.GetElement()
结果如下:
在表中查找某一指定结点
class DoubleLinkedNode:
def __init__(self,data):
self.data = data
self.next = None
self.prev = None
class CircularDoubleLinkedList:
def __init__(self):
self.head = DoubleLinkedNode(None)
'''创建循环双链表'''
def CreatCircularDoubleLinkedList(self):
data = input("请输入数据(按回车键确定,按“#”结束):")
cNode = self.head
while data != "#":
nNode = DoubleLinkedNode(int(data))
cNode.next = nNode
nNode.prev = cNode
nNode.next = self.head
self.head.prev = nNode
cNode = cNode.next
data = input("请输入数据(按回车键确定,按“#”结束):")
'''获取循环双链表长度'''
def GetLength(self):
cNode = self.head
i = 0
while cNode.next != self.head and cNode.next != None:
i += 1
cNode = cNode.next
return i
'''判断是否为空'''
def IsEmpty(self):
if self.GetLength() == 0:
return True
else:
return False
'''在表中查找某一指定结点'''
def FindElement(self):
pos = 0
cNode = self.head
key = int(input('请输入要查找的值:'))
if self.IsEmpty():
print('双链表为空')
return
while cNode.next != self.head and cNode.data != key:
cNode = cNode.next
pos+=1
if cNode.data == key:
print('查找成功,位置为:',pos)
else:
print('查找失败')
CDLList = CircularDoubleLinkedList()
CDLList.CreatCircularDoubleLinkedList()
CDLList.FindElement()
结果如下:
遍历表中所有结点并输出
class DoubleLinkedNode:
def __init__(self,data):
self.data = data
self.next = None
self.prev = None
class CircularDoubleLinkedList:
def __init__(self):
self.head = DoubleLinkedNode(None)
'''创建循环双链表'''
def CreatCircularDoubleLinkedList(self):
data = input("请输入数据(按回车键确定,按“#”结束):")
cNode = self.head
while data != "#":
nNode = DoubleLinkedNode(int(data))
cNode.next = nNode
nNode.prev = cNode
nNode.next = self.head
self.head.prev = nNode
cNode = cNode.next
data = input("请输入数据(按回车键确定,按“#”结束):")
def VisitElementByNext(self,tNode):
if tNode != self.head:
print(tNode.data,"->",end = " ")
def VisitElementByPrev(self,tNode):
if tNode != self.head:
print(tNode.data,"->",end = " ")
def TraversDoubleLinkedList1(self):
cNode = self.head
print("按next域遍历带头结点循环双链表:")
while cNode.next!= self.head:
cNode = cNode.next
self.VisitElementByNext(cNode)
def TraversDoubleLinkedList2(self):
cNode = self.head
while cNode.next!= self.head:
cNode = cNode.next
print("\n按prev域遍历带头结点循环双链表:")
print(cNode.data,"->",end = " ")
while cNode.prev!= self.head:
cNode = cNode.prev
self.VisitElementByPrev(cNode)
CDLList = CircularDoubleLinkedList()
CDLList.CreatCircularDoubleLinkedList()
CDLList.TraversDoubleLinkedList1()
CDLList.TraversDoubleLinkedList2()
结果如下: