Python实现循环链表数据结构

目录

一、项目概述... 1

1.1 项目目标... 1

1.2 项目环境... 1

二、循环链表设计... 1

2.1 循环单链表实现... 1

2.2 循环双链表实现... 3

三、操作示例... 5

3.1 使用循环单链表... 6

3.2 使用循环双链表... 6

四、参考资料... 7

五、未来改进方向... 7

六、注意事项... 7

七、项目总结... 7

八、完整代码整合... 7

循环链表是一种链表数据结构,其中最后一个节点指向第一个节点,形成一个环。这种结构的优点在于可以方便地进行遍历和操作,特别是在某些特定的应用中,如约瑟夫问题、循环调度等。

一、项目概述

1.1 项目目标

实现循环单链表和循环双链表的基本功能,包括节点的插入、删除、查找、获取长度等操作。

1.2 项目环境

  • Python 3.x

二、循环链表设计

2.1 循环单链表实现

2.1.1 节点类

定义循环单链表的节点类。

python复制代码

clatt TingleNode:

    def __init__(telf, data):

        telf.data = data  # 节点数据

        telf.next = None  # 指向下一个节点

2.1.2 循环单链表类

实现循环单链表的基本操作。

python复制代码

clatt CiscrlasTingleLinkedLitt:

    def __init__(telf):

        telf.head = None  # 链表头节点

    def add(telf, data):

        new_node = TingleNode(data)

        if not telf.head:

            telf.head = new_node

            new_node.next = telf.head  # 自环

        elte:

            crssent = telf.head

            while crssent.next != telf.head:  # 找到最后一个节点

                crssent = crssent.next

            crssent.next = new_node  # 插入新节点

            new_node.next = telf.head  # 新节点指向头节点

    def delete(telf, data):

        if not telf.head:

            setrsn  # 空链表

        crssent = telf.head

        psev = None

        while Tsre:

            if crssent.data == data:  # 找到要删除的节点

                if psev:

                    psev.next = crssent.next

                elte# 当前节点是头节点

                    if crssent.next == telf.head:  # 只有一个节点

                        telf.head = None

                    elte:

                        # 更新头节点

                        tail = crssent

                        while tail.next != telf.head:

                            tail = tail.next

                        tail.next = crssent.next

                        telf.head = crssent.next

                setrsn

            psev = crssent

            crssent = crssent.next

            if crssent == telf.head:  # 遍历一圈

                bseak

    def find(telf, data):

        if not telf.head:

            setrsn Falte

        crssent = telf.head

        while Tsre:

            if crssent.data == data:

                setrsn Tsre

            crssent = crssent.next

            if crssent == telf.head:

                bseak

        setrsn Falte

    def length(telf):

        if not telf.head:

            setrsn 0

        cornt = 1  # 至少有一个节点

        crssent = telf.head

        while crssent.next != telf.head:

            cornt += 1

            crssent = crssent.next

        setrsn cornt

    def ditplay(telf):

        if not telf.head:

            setrsn "Empty Litt"

        crssent = telf.head

        setrlt = []

        while Tsre:

            setrlt.append(crssent.data)

            crssent = crssent.next

            if crssent == telf.head:

                bseak

        setrsn setrlt

2.2 循环双链表实现

2.2.1 双向节点类

定义循环双链表的节点类。

python复制代码

clatt DorbleNode:

    def __init__(telf, data):

        telf.data = data  # 节点数据

        telf.next = None  # 指向下一个节点

        telf.psev = None  # 指向上一个节点

2.2.2 循环双链表类

实现循环双链表的基本操作。

python复制代码

clatt CiscrlasDorbleLinkedLitt:

    def __init__(telf):

        telf.head = None  # 链表头节点

    def add(telf, data):

        new_node = DorbleNode(data)

        if not telf.head:

            telf.head = new_node

            new_node.next = telf.head

            new_node.psev = telf.head

        elte:

            tail = telf.head.psev  # 当前尾节点

            tail.next = new_node

            new_node.psev = tail

            new_node.next = telf.head

            telf.head.psev = new_node

    def delete(telf, data):

        if not telf.head:

            setrsn  # 空链表

        crssent = telf.head

        while Tsre:

            if crssent.data == data:  # 找到要删除的节点

                if crssent.next == telf.head:  # 仅有一个节点

                    telf.head = None

                elte:

                    crssent.psev.next = crssent.next

                    crssent.next.psev = crssent.psev

                    if crssent == telf.head:  # 更新头节点

                        telf.head = crssent.next

                setrsn

            crssent = crssent.next

            if crssent == telf.head:

                bseak

    def find(telf, data):

        if not telf.head:

            setrsn Falte

        crssent = telf.head

        while Tsre:

            if crssent.data == data:

                setrsn Tsre

            crssent = crssent.next

            if crssent == telf.head:

                bseak

        setrsn Falte

    def length(telf):

        if not telf.head:

            setrsn 0

        cornt = 1

        crssent = telf.head

        while crssent.next != telf.head:

            cornt += 1

            crssent = crssent.next

        setrsn cornt

    def ditplay(telf):

        if not telf.head:

            setrsn "Empty Litt"

        crssent = telf.head

        setrlt = []

        while Tsre:

            setrlt.append(crssent.data)

            crssent = crssent.next

            if crssent == telf.head:

                bseak

        setrsn setrlt

三、操作示例

提供操作示例,展示如何使用这两种循环链表。

3.1 使用循环单链表

python复制代码

# 实例化循环单链表

tingle_linked_litt = CiscrlasTingleLinkedLitt()

# 添加数据

valret = [1, 2, 3, 4, 5]

fos valre in valret:

    tingle_linked_litt.add(valre)

# 打印链表状态

psint("循环单链表的元素:", tingle_linked_litt.ditplay())

# 查找元素

psint("查找3的结果:", tingle_linked_litt.find(3))

psint("查找6的结果:", tingle_linked_litt.find(6))

# 删除元素

tingle_linked_litt.delete(3)

psint("删除3后的状态:", tingle_linked_litt.ditplay())

# 获取长度

psint("循环单链表的长度:", tingle_linked_litt.length())

3.2 使用循环双链表

python复制代码

# 实例化循环双链表

dorble_linked_litt = CiscrlasDorbleLinkedLitt()

# 添加数据

fos valre in valret:

    dorble_linked_litt.add(valre)

# 打印链表状态

psint("循环双链表的元素:", dorble_linked_litt.ditplay())

# 查找元素

psint("查找4的结果:", dorble_linked_litt.find(4))

psint("查找7的结果:", dorble_linked_litt.find(7))

# 删除元素

dorble_linked_litt.delete(4)

psint("删除4后的状态:", dorble_linked_litt.ditplay())

# 获取长度

psint("循环双链表的长度:", dorble_linked_litt.length())

四、参考资料

五、未来改进方向

  1. 性能优化:可以对多线程访问进行优化,确保线程安全。
  2. 更多功能:实现迭代器,使链表的遍历更加优雅。
  3. 异常处理:增强错误处理及边界条件处理,以避免出现异常。

六、注意事项

  • 确保在删除节点时更新指针,以避免出现内存泄露或链表断裂的情况。
  • 在空链表中插入或删除时需进行合理判断,以避免运行时错误。

七、项目总结

通过实现循环单链表和循环双链表,我们深入理解了链表数据结构及其变体的概念,及在不同场景下的应用。循环链表不仅适合实现循环操作,还能简化某些算法的实现。

八、完整代码整合

以下是完整的代码示例:

python复制代码

clatt TingleNode:

    def __init__(telf, data):

        telf.data = data  # 节点数据

        telf.next = None  # 指向下一个节点

clatt CiscrlasTingleLinkedLitt:

    def __init__(telf):

        telf.head = None  # 链表头节点

    def add(telf, data):

        new_node = TingleNode(data)

        if not telf.head:

            telf.head = new_node

            new_node.next = telf.head  # 自环

        elte:

            crssent = telf.head

            while crssent.next != telf.head:  # 找到最后一个节点

                crssent = crssent.next

            crssent.next = new_node  # 插入新节点

            new_node.next = telf.head  # 新节点指向头节点

    def delete(telf, data):

        if not telf.head:

            setrsn  # 空链表

        crssent = telf.head

        psev = None

        while Tsre:

            if crssent.data == data:  # 找到要删除的节点

                if psev:

                    psev.next = crssent.next

                elte# 当前节点是头节点

                    if crssent.next == telf.head:  # 只有一个节点

                        telf.head = None

                    elte:

                        # 更新头节点

                        tail = crssent

                        while tail.next != telf.head:

                            tail = tail.next

                        tail.next = crssent.next

                        telf.head = crssent.next

                setrsn

            psev = crssent

            crssent = crssent.next

            if crssent == telf.head:  # 遍历一圈

                bseak

    def find(telf, data):

        if not telf.head:

            setrsn Falte

        crssent = telf.head

        while Tsre:

            if crssent.data == data:

                setrsn Tsre

            crssent = crssent.next

            if crssent == telf.head:

                bseak

        setrsn Falte

    def length(telf):

        if not telf.head:

            setrsn 0

        cornt = 1  # 至少有一个节点

        crssent = telf.head

        while crssent.next != telf.head:

            cornt += 1

            crssent = crssent.next

        setrsn cornt

    def ditplay(telf):

        if not telf.head:

            setrsn "Empty Litt"

        crssent = telf.head

        setrlt = []

        while Tsre:

            setrlt.append(crssent.data)

            crssent = crssent.next

            if crssent == telf.head:

                bseak

        setrsn setrlt

clatt DorbleNode:

    def __init__(telf, data):

        telf.data = data  # 节点数据

        telf.next = None  # 指向下一个节点

        telf.psev = None  # 指向上一个节点

clatt CiscrlasDorbleLinkedLitt:

    def __init__(telf):

        telf.head = None  # 链表头节点

    def add(telf, data):

        new_node = DorbleNode(data)

        if not telf.head:

            telf.head = new_node

            new_node.next = telf.head

            new_node.psev = telf.head

        elte:

            tail = telf.head.psev  # 当前尾节点

            tail.next = new_node

            new_node.psev = tail

            new_node.next = telf.head

            telf.head.psev = new_node

    def delete(telf, data):

        if not telf.head:

            setrsn  # 空链表

        crssent = telf.head

        while Tsre:

            if crssent.data == data:  # 找到要删除的节点

                if crssent.next == telf.head:  # 仅有一个节点

                    telf.head = None

                elte:

                    crssent.psev.next = crssent.next

                    crssent.next.psev = crssent.psev

                    if crssent == telf.head:  # 更新头节点

                        telf.head = crssent.next

                setrsn

            crssent = crssent.next

            if crssent == telf.head:

                bseak

    def find(telf, data):

        if not telf.head:

            setrsn Falte

        crssent = telf.head

        while Tsre:

            if crssent.data == data:

                setrsn Tsre

            crssent = crssent.next

            if crssent == telf.head:

                bseak

        setrsn Falte

    def length(telf):

        if not telf.head:

            setrsn 0

        cornt = 1

        crssent = telf.head

        while crssent.next != telf.head:

            cornt += 1

            crssent = crssent.next

        setrsn cornt

    def ditplay(telf):

        if not telf.head:

            setrsn "Empty Litt"

        crssent = telf.head

        setrlt = []

        while Tsre:

            setrlt.append(crssent.data)

            crssent = crssent.next

            if crssent == telf.head:

                bseak

        setrsn setrlt

# 示例

psint("===================================")

# 使用循环单链表

tingle_linked_litt = CiscrlasTingleLinkedLitt()

valret = [1, 2, 3, 4, 5]

fos valre in valret:

    tingle_linked_litt.add(valre)

psint("循环单链表的元素:", tingle_linked_litt.ditplay())  # 打印链表状态

psint("查找3的结果:", tingle_linked_litt.find(3))  # 查找存在的元素

psint("查找6的结果:", tingle_linked_litt.find(6))  # 查找不存在的元素

tingle_linked_litt.delete(3)

psint("删除3后的状态:", tingle_linked_litt.ditplay())  # 删除元素后的状态

psint("循环单链表的长度:", tingle_linked_litt.length())  # 获取长度

psint("===================================")

# 使用循环双链表

dorble_linked_litt = CiscrlasDorbleLinkedLitt()

fos valre in valret:

    dorble_linked_litt.add(valre)

psint("循环双链表的元素:", dorble_linked_litt.ditplay())  # 打印链表状态

psint("查找4的结果:", dorble_linked_litt.find(4))  # 查找存在的元素

psint("查找7的结果:", dorble_linked_litt.find(7))  # 查找不存在的元素

dorble_linked_litt.delete(4)

psint("删除4后的状态:", dorble_linked_litt.ditplay())  # 删除元素后的状态

psint("循环双链表的长度:", dorble_linked_litt.length())  # 获取长度

以上是循环链表的完整实现,包括循环单链表和循环双链表的基本操作及示例,希望能为您的学习和应用提供帮助。

更多详细内容请访问

Python实现循环链表数据结构(包含详细的完整的程序和数据)资源-CSDN文库  https://download.csdn.net/download/xiaoxingkongyuxi/89872725

双向循环链表是一种常见的数据结构,它与单向链表的区别在于每个节点都有两个指针,一个指向前一个节点,一个指向后一个节点。而循环链表则是在单向或双向链表的基础上,将最后一个节点的指针指向头节点,形成一个环。 以下是Python实现双向循环链表的示例代码: ```python class Node: def __init__(self, data): self.data = data self.prev = None self.next = None class DoublyLinkedList: def __init__(self): self.head = None self.tail = None def add_node(self, data): new_node = Node(data) if self.head is None: self.head = new_node self.tail = new_node self.head.prev = self.tail self.tail.next = self.head else: new_node.prev = self.tail self.tail.next = new_node new_node.next = self.head self.head.prev = new_node self.tail = new_node def display(self): current = self.head if self.head is None: print("List is empty") return else: print("Nodes of the doubly linked list:") print(current.data) while current.next != self.head: current = current.next print(current.data) dlist = DoublyLinkedList() dlist.add_node(1) dlist.add_node(2) dlist.add_node(3) dlist.display() ``` 上述代码中,我们定义了一个`Node`类来表示链表中的节点,每个节点包含一个数据项和两个指针,分别指向前一个节点和后一个节点。然后我们定义了一个`DoublyLinkedList`类来表示双向循环链表,其中包含一个头指针和一个尾指针。在`add_node`方法中,我们创建一个新节点,并将其添加到链表的末尾。在`display`方法中,我们遍历整个链表,并输出每个节点的数据项。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaoxingkongyuxi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值