数据结构之python实现循环双链表

循环双链表:就是将双链表中最后一个结点的后继指针指向双链表的头结点,并将其头结点的先驱指针指向表中最后一个结点。

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

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

猜你喜欢

转载自blog.csdn.net/weixin_40283816/article/details/87300424