定义
双链表就是同时包含两个指针域的结点构成的链表。
python实现
创建双链表
class DoubleLinkedNode:
def __init__(self,data):
self.data = data
self.next = None
self.prev = None
class DoubleLinkedList:
def __init__(self):
self.head = DoubleLinkedNode(None)
def CreateDoubleLinkedList(self):
data = input("请输入元素(回车键确定,#结束):")
cNode = self.head
while data != "#":
element = DoubleLinkedNode(int(data))
cNode.next = element
element.prev = cNode
cNode = cNode.next
data = input("请输入元素(回车键确定,#结束):")
DLList = DoubleLinkedList()
DLList.CreateDoubleLinkedList()
结果如下:
尾端插入元素
class DoubleLinkedNode:
def __init__(self,data):
self.data = data
self.next = None
self.prev = None
class DoubleLinkedList:
def __init__(self):
self.head = DoubleLinkedNode(None)
def CreateDoubleLinkedList(self):
data = input("请输入元素(回车键确定,#结束):")
cNode = self.head
while data != "#":
element = DoubleLinkedNode(int(data))
cNode.next = element
element.prev = cNode
cNode = cNode.next
data = input("请输入元素(回车键确定,#结束):")
def InsertElementInTail(self):
cNode = self.head
data = input("请输入要插入的值:")
nNode = DoubleLinkedNode(int(data))
while cNode.next!= None:
cNode = cNode.next
cNode.next = nNode
nNode.prev = cNode
def GetLength(self):
cNode = self.head
length = 0
while cNode.next != None:
length = length+1
cNode = cNode.next
print(length)
DLList = DoubleLinkedList()
DLList.CreateDoubleLinkedList()
DLList.InsertElementInTail()
DLList.GetLength()
结果如下:
首端插入元素
class DoubleLinkedNode:
def __init__(self,data):
self.data = data
self.next = None
self.prev = None
class DoubleLinkedList:
def __init__(self):
self.head = DoubleLinkedNode(None)
def CreateDoubleLinkedList(self):
data = input("请输入元素(回车键确定,#结束):")
cNode = self.head
while data != "#":
element = DoubleLinkedNode(int(data))
cNode.next = element
element.prev = cNode
cNode = cNode.next
data = input("请输入元素(回车键确定,#结束):")
def InsertElementInHead(self):
cNode = self.head.next
pNode = self.head
data = input("请输入要插入的值:")
nNode = DoubleLinkedNode(int(data))
pNode.next = nNode
nNode.prev = pNode
nNode.next = cNode
cNode.prev = nNode
def GetLength(self):
cNode = self.head
length = 0
while cNode.next != None:
length = length+1
cNode = cNode.next
print(length)
DLList = DoubleLinkedList()
DLList.CreateDoubleLinkedList()
DLList.InsertElementInHead()
DLList.GetLength()
结果如下:
删除指定元素值
class DoubleLinkedNode:
def __init__(self,data):
self.data = data
self.next = None
self.prev = None
class DoubleLinkedList:
def __init__(self):
self.head = DoubleLinkedNode(None)
class DoubleLinkedList:
def __init__(self):
self.head = DoubleLinkedNode(None)
def CreateDoubleLinkedList(self):
data = input("请输入元素(回车键确定,#结束):")
cNode = self.head
while data != "#":
element = DoubleLinkedNode(int(data))
cNode.next = element
element.prev = cNode
cNode = cNode.next
data = input("请输入元素(回车键确定,#结束):")
def DeleteElement(self):
cNode = self.head
pNode = self.head
data = int(input("请输入要删除的元素值:"))
while cNode.next != None and cNode.data!= data:
pNode = cNode
cNode = cNode.next
if cNode.data == data:
if cNode.next == None:
pNode.next = None
del cNode
else:
pNode.next = cNode.next
cNode.next.prev = pNode
del cNode
print("已成功删除")
else:
print("没有此值,删除失败")
def GetLength(self):
cNode = self.head
length = 0
while cNode.next != None:
length = length+1
cNode = cNode.next
print(length)
DLList = DoubleLinkedList()
DLList.CreateDoubleLinkedList()
DLList.DeleteElement()
DLList.GetLength()
结果如下:
获取双链表长度
class DoubleLinkedNode:
def __init__(self,data):
self.data = data
self.next = None
self.prev = None
class DoubleLinkedList:
def __init__(self):
self.head = DoubleLinkedNode(None)
def CreateDoubleLinkedList(self):
data = input("请输入元素(回车键确定,#结束):")
cNode = self.head
while data != "#":
element = DoubleLinkedNode(int(data))
cNode.next = element
element.prev = cNode
cNode = cNode.next
data = input("请输入元素(回车键确定,#结束):")
def GetLength(self):
cNode = self.head
length = 0
while cNode.next != None:
length = length+1
cNode = cNode.next
print(length)
DLList = DoubleLinkedList()
DLList.CreateDoubleLinkedList()
DLList.GetLength()
结果如下:
判断双链表是否为空
class DoubleLinkedNode:
def __init__(self,data):
self.data = data
self.next = None
self.prev = None
class DoubleLinkedList:
def __init__(self):
self.head = DoubleLinkedNode(None)
def CreateDoubleLinkedList(self):
data = input("请输入元素(回车键确定,#结束):")
cNode = self.head
while data != "#":
element = DoubleLinkedNode(int(data))
cNode.next = element
element.prev = cNode
cNode = cNode.next
data = input("请输入元素(回车键确定,#结束):")
def GetLength(self):
cNode = self.head
length = 0
while cNode.next != None:
length = length+1
cNode = cNode.next
return length
def IsEmpty(self):
if self.GetLength()==0:
return True
else:
return False
DLList = DoubleLinkedList()
DLList.CreateDoubleLinkedList()
DLList.IsEmpty()
结果如下:
在表中指定位置插入结点
class DoubleLinkedNode:
def __init__(self,data):
self.data = data
self.next = None
self.prev = None
class DoubleLinkedList:
def __init__(self):
self.head = DoubleLinkedNode(None)
def CreateDoubleLinkedList(self):
data = input("请输入元素(回车键确定,#结束):")
cNode = self.head
while data != "#":
element = DoubleLinkedNode(int(data))
cNode.next = element
element.prev = cNode
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 != 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
length = 0
while cNode.next != None:
length = length+1
cNode = cNode.next
print(length)
DLList = DoubleLinkedList()
DLList.CreateDoubleLinkedList()
DLList.InsertElement()
DLList.GetLength()
结果如下:
销毁双链表
class DoubleLinkedNode:
def __init__(self,data):
self.data = data
self.next = None
self.prev = None
class DoubleLinkedList:
def __init__(self):
self.head = DoubleLinkedNode(None)
def CreateDoubleLinkedList(self):
data = input("请输入元素(回车键确定,#结束):")
cNode = self.head
while data != "#":
element = DoubleLinkedNode(int(data))
cNode.next = element
element.prev = cNode
cNode = cNode.next
data = input("请输入元素(回车键确定,#结束):")
def IsEmpty(self):
if self.GetLength()==0:
return True
else:
return False
def GetLength(self):
cNode = self.head
length = 0
while cNode.next != None:
length = length+1
cNode = cNode.next
return length
def DestoryDoubleLinkedList(self):
cNode = self.head
cNode.next = None
DLList = DoubleLinkedList()
DLList.CreateDoubleLinkedList()
DLList.DestoryDoubleLinkedList()
DLList.IsEmpty()
结果如下:
获取表中指定位置结点的值
class DoubleLinkedNode:
def __init__(self,data):
self.data = data
self.next = None
self.prev = None
class DoubleLinkedList:
def __init__(self):
self.head = DoubleLinkedNode(None)
def CreateDoubleLinkedList(self):
data = input("请输入元素(回车键确定,#结束):")
cNode = self.head
while data != "#":
element = DoubleLinkedNode(int(data))
cNode.next = element
element.prev = cNode
cNode = cNode.next
data = input("请输入元素(回车键确定,#结束):")
def IsEmpty(self):
if self.GetLength()==0:
return True
else:
return False
def GetLength(self):
cNode = self.head
length = 0
while cNode.next != None:
length = length+1
cNode = cNode.next
return length
def GetElement(self):
index = int(input('请输入要查找结点的位置:'))
cNode = self.head
pos = 0
while cNode.next != None and pos < index:
cNode = cNode.next
pos += 1
if index == pos:
return cNode.data
DLList = DoubleLinkedList()
DLList.CreateDoubleLinkedList()
DLList.GetElement()
结果如下:
在表中查找某一指定结点
class DoubleLinkedNode:
def __init__(self,data):
self.data = data
self.next = None
self.prev = None
class DoubleLinkedList:
def __init__(self):
self.head = DoubleLinkedNode(None)
def CreateDoubleLinkedList(self):
data = input("请输入元素(回车键确定,#结束):")
cNode = self.head
while data != "#":
element = DoubleLinkedNode(int(data))
cNode.next = element
element.prev = cNode
cNode = cNode.next
data = input("请输入元素(回车键确定,#结束):")
def IsEmpty(self):
if self.GetLength()==0:
return True
else:
return False
def GetLength(self):
cNode = self.head
length = 0
while cNode.next != None:
length = length+1
cNode = cNode.next
return length
def GetElement(self):
index = int(input('请输入要查找结点的位置:'))
cNode = self.head
pos = 0
while cNode.next != None and pos < index:
cNode = cNode.next
pos += 1
if index == pos:
return cNode.data
def FindElement(self):
pos = 0
cNode = self.head
key = int(input('请输入要查找的值:'))
if self.IsEmpty():
print('双链表为空')
return
while cNode.next != None and cNode.data != key:
cNode = cNode.next
pos+=1
if cNode.data == key:
print('查找成功,位置为:',pos)
else:
print('查找失败')
DLList = DoubleLinkedList()
DLList.CreateDoubleLinkedList()
DLList.FindElement()
结果如下:
遍历表中所有结点并输出
class DoubleLinkedNode:
def __init__(self,data):
self.data = data
self.next = None
self.prev = None
class DoubleLinkedList:
def __init__(self):
self.head = DoubleLinkedNode(None)
def CreateDoubleLinkedList(self):
data = input("请输入元素(回车键确定,#结束):")
cNode = self.head
while data != "#":
element = DoubleLinkedNode(int(data))
cNode.next = element
element.prev = cNode
cNode = cNode.next
data = input("请输入元素(回车键确定,#结束):")
def VisitElementByNext(self,tNode):
if tNode!=None:
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!= None:
cNode = cNode.next
self.VisitElementByNext(cNode)
def TraversDoubleLinkedList2(self):
cNode = self.head
while cNode.next!= None:
cNode = cNode.next
print("\n按prev域遍历带头结点双链表:")
print(cNode.data,"->",end = " ")
while cNode.prev!= self.head:
cNode = cNode.prev
self.VisitElementByPrev(cNode)
DLList = DoubleLinkedList()
DLList.CreateDoubleLinkedList()
DLList.TraversDoubleLinkedList1()
DLList.TraversDoubleLinkedList2()
结果如下: