数据结构之python实现双链表

定义

双链表就是同时包含两个指针域的结点构成的链表。

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()

结果如下:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_40283816/article/details/86682290
今日推荐