• python中的单向循环链表实现


    引子

    所谓单向循环链表,不过是在单向链表的基础上,如响尾蛇般将其首尾相连,也因此有诸多类似之处与务必留心之点。尤其是可能涉及到头尾节点的操作,不可疏忽。

    对于诸多操所必须的遍历,这时的条件是什么?又应该在哪里停止?

    在做删除操作时,如若待删除节点是头或尾节点时,该如何处理?如果链表只有一个节点,又该如何处理?

    代码实现

    class Node(object):
        def __init__(self, value):
            # 元素域
            self.value = value
            # 链接域
            self.next = None
    
    
    class CircularLinkedListOneway(object):
        def __init__(self, node=None):
            # 构造非空链时,让其地址域指向自己
            if node:
                node.next = node
            self.__head = node
    
        def is_empty(self):
            # 头节点不为None则不为空
            return self.__head == None
    
        def __len__(self):
            count = 1
            cur = self.__head
            if self.is_empty():
                return 0
            while cur.next != self.__head:
                count += 1
                cur = cur.next
            return count
    
        def traversal(self):
            if self.is_empty():
                return
            cur = self.__head
            while cur.next != self.__head:
                print(cur.value)
                cur = cur.next
            # 退出循环时,cur正是尾节点
            print(cur.value)
    
        def add(self, value):
            """头插法"""
            node = Node(value)
            if self.is_empty():
                self.__head = node
                self.__head.next = self.__head
                return
            cur = self.__head
            while cur.next != self.__head:
                cur = cur.next
            # 新节点的next指针指向原头节点
            node.next = self.__head
            # 将新节点指向头节点
            self.__head = node
            # 尾节点next指针指向新头节点
            cur.next = self.__head
    
        def append(self, value):
            node = Node(value)
            cur = self.__head
            if self.is_empty():
                self.__head = node
                self.__head.next = self.__head
                return
            while cur.next != self.__head:
                cur = cur.next
            node.next = cur.next
            cur.next = node
    
        def insert(self, pos, value):
            if pos <= 0:
                self.add(value)
            elif pos > len(self) - 1:
                self.append(value)
            else:
                node = Node(value)
                cur = self.__head
                count = 0
                while count < pos - 1:
                    count += 1
                    cur = cur.next
                node.next = cur.next
                cur.next = node
    
        def search(self, value):
            if self.is_empty():
                return False
            cur = self.__head
            while cur.next != self.__head:
                if cur.value == value:
                    return True
                else:
                    cur = cur.next
            # 别忘了while循环外的尾节点
            if cur.value == value:
                return True
            return False
    
        def remove(self, value):
            cur = self.__head
            prior = None
            if self.is_empty():
                return
            while cur.next != self.__head:
                # 待删除节点如果找到
                if cur.value == value:
                    # 待删除节点在头部
                    if cur == self.__head:
                        rear = self.__head
                        while rear.next != self.__head:
                            rear = rear.next
                        self.__head = cur.next
                        rear.next = self.__head
                    # 待删除节点在中间
                    else:
                        prior.next = cur.next
              # 这里不是跳出循环的break,而是退出函数的return哦,因为已经处理完毕了
    return # 如果还没找到 else: prior = cur cur = cur.next # 待删除节点在尾部 if cur.value == value: # 如果链表中只有一个元素,则此时prior为None,Next属性就会报错 # 此时直接使其头部元素为None即可 if cur == self.__head: self.__head = None return prior.next = cur.next
  • 相关阅读:
    硬盘安装RedHat,FC和CentOS5.7
    Stanford CoreNLP开源项目的3种编译和运行方式
    Heritrix源码分析(六) Heritrix的文件结构分析
    java里抽象类和接口的区别
    centos 5 手动分区来安装系统的方法
    最大熵工具包的使用
    Heritrix源码分析(五) 如何让Heritrix在Ecplise等IDE下编程启动
    linux配置java环境变量(详细)
    CentOS安装中文支持(linux中文文件名乱码)
    安排会议,使得每个员工能够参加至少两次会议,并使会议总次数最少
  • 原文地址:https://www.cnblogs.com/yifeixu/p/8965082.html
Copyright © 2020-2023  润新知