链表之循环链表

前言

单向链表:链表之单向链表
循环链表是单向链表的变化形式。单向链表的尾部的指针域是空的,而循环链表的尾部指针是指向链表的头结点的,其结构如图一所示。

图 一 循 环 链 表 结 构 图一 循环链表结构
从上面结构可以看出,循环链表的节点形成了一个圈。在进行遍历时,可以从任意节点开始。如果记录了尾部节点的话,循环链表的操作会方便很多,比如,可以实现O(1)时间的表头/表尾插入和O(1)时间的表头删除。

编程实现

(1) 功能

  1. is_empty() 链表是否为空
  2. length() 链表的长度
  3. scan() 遍历链表的节点
  4. add(item) 头部添加节点
  5. append(item) 在尾部添加节点
  6. insert(position,item) 中间插入节点
  7. remove(item)移除指定节点
  8. search(item) 查找是否存在包含该元素的节点

(2)代码实现

以下是以python实现的代码

class Node:
    """创建节点"""

    def __init__(self, data):
        self.data = data
        self.next = None


class CycleLinkedList(object):
    """创建循环链表"""

    def __init__(self, node=None):
        self.rear = node
        if node is not None:
            self.rear.next = node

    def is_empty(self):
        """链表是否为空"""
        return self.rear == None

    def length(self):
        """链表长度"""
        if self.rear is None:
            return 0
        else:
            count = 0
            curNode = self.rear.next
            while curNode:
                count += 1
                curNode = curNode.next
                if curNode == self.rear.next:
                    return count

    def add(self, item):
        """头部插入"""
        """保存了self.rear属性,使的找到头节点很方便"""
        node = Node(item)
        if self.is_empty():
            self.rear = node
            self.rear.next = node
        else:
            node.next = self.rear.next
            self.rear.next = node

    def append(self, item):
        """尾端插入"""
        """先执行前端插入,再执行尾部指针移动"""
        self.add(item)  # 头部插入
        self.rear = self.rear.next  # 将尾部指针移动到新添加的节点处

    def insert(self, index, item):
        """"索引是index,节点是第index+1个节点"""
        if index <= 0:
            self.add(item)
        elif index > self.length() - 1:
            self.append(item)
        else:
            node = Node(item)
            curNode = self.rear.next  # 找到头节点
            count = 0
            while count < index - 1:
                curNode = curNode.next
                count += 1
            node.next = curNode.next
            curNode.next = node

    def remove(self, item):
        """移除节点"""
        if self.is_empty():
            return
        else:
            curNode = self.rear.next
            precurNode = None
            while curNode:
                if curNode.data == item:
                    if curNode == self.rear.next:  # 要删除的是头节点
                        self.rear.next = curNode.next
                    else:
                        precurNode.next = curNode.next
                    break
                precurNode = curNode
                curNode = curNode.next

    def scan(self):
        """遍历链表"""
        if self.rear is None:
            return
        curNode = self.rear.next  # 通过尾部指针获取头节点
        while curNode:
            print(curNode.data, end=' ')
            curNode = curNode.next
            if curNode == self.rear.next:
                return

    def search(self, item):
        curNode = self.rear.next
        while curNode:
            if curNode.data == item:
                return True
            curNode = curNode.next
            if curNode.next == self.rear.next:
                return
        return False

# 测试代码
cl = CycleLinkedList()
cl.add(1)
cl.append(2)
cl.append(3)
cl.append(5)
cl.insert(3, 4)
cl.remove(5)
print(cl.search(3))
cl.scan()

运行结果如下:
在这里插入图片描述
从运行结果上看,代码运行正常,如有不合适之处,敬请指正,谢谢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值