zoukankan      html  css  js  c++  java
  • python-实现单向循环链表

    # encoding=utf-8
    
    
    class Node(object):
        """节点类"""
        def __init__(self, item):
            """
            初始化函数
            :param item:  要保存的用户数据
            """
            self.item = item
            self.next = None
    
    
    class CycleSingleLinkList(object):
        """循环单链表"""
        def __init__(self, node=None):
            """
            初始化函数r
            :param node: 可传可不传的头节点
            """
            # 指向头节点
            self.__head = node
    
        def is_empty(self):
            """链表是否为空"""
            return self.__head is None
    
        def length(self):
            """链表长度"""
            if self.is_empty():
                return 0
    
            current = self.__head
            count = 1
    
            while current.next != self.__head:
                count += 1
                current = current.next
            return count
    
        def travel(self):
            """遍历整个链表 要考虑空链表如果是空链表判断条件不成立也就不输出任何信息"""
            if self.is_empty():
                print("")
                return
            current = self.__head
            while current.next != self.__head:
                print(current.item, end=" ")
                current = current.next
    
            # 退出循环时游标指向了尾节点
            print(current.item, end=" ")
            print("")  # 多输出换行
    
        def add(self, item):
            """"在链表头部插入元素"""
            node = Node(item)
            if self.is_empty():
                node.next = node
                self.__head = node
            else:
                cur = self.__head
                # 寻找尾节点
                while cur.next != self.__head:
                    cur = cur.next
                node.next = self.__head
                self.__head = node
                cur.next = node
    
        def append(self, item):
            """"在链表尾部插入节点"""
            node = Node(item)
            if self.is_empty():
                self.__head = node
                node.next = node
            else:
                cur = self.__head
                while cur.next != self.__head:
                    cur = cur.next
    
                node.next = self.__head
                cur.next = node
    
        def insert(self, pos, item):
            """指定位置添加元素"""
            # 在头结点插入元素
            if pos <=0:
                self.add(item)
            # 在链表的尾部添加元素
            elif pos >= self.length():
                self.append(item)
    
            # 在链表的任意位置添加元素
    
            else:
                cur = self.__head
                count = 0
                # 找到添加位置的前一个位置
                while count < (pos-1):
                    count += 1
                    cur = cur.next
                node = Node(item)
                node.next = cur.next
                cur.next = node
    
        def remove(self, item):
            """
            删除节点
            :param item: 要删除的元素
            :return:
            """
            if self.is_empty():
                return
            cur = self.__head
            pre = None
            while cur.next != self.__head:
                # 找到了元素
                if cur.item == item:
                    # 在头部找到了元素
                    if cur == self.__head:
                        rel = self.__head
                        while rel.next != self.__head:
                            rel = rel.next
                        self.__head = cur.next
                        rel.next = self.__head
                    else:
                        pre.next = cur.next
                    return
                pre = cur
                cur = cur.next
            # 退出循环后, cur指向了尾节点
            if cur.item == item:
                if pre:
                    pre.next = self.__head
                else:
                    # 链表只有一个节点
                    self.__head = None
    
        def search(self, item):
            """
            查找节点是否存在
            :param item: 要查找的element
            :return:
            """
            cur = self.__head
    
            while cur.next != self.__head:
                if cur.item == item:
                    return True
                cur = cur.next
            # 退出循环后, cur指向了尾节点
            if cur.item == item:
                return True
            return False
    
    if __name__ == '__main__':
        ll = CycleSingleLinkList()
        print(ll.length())
    
        ll.append(1)   # 1
        print(ll.length())
        ll.travel()
    
        ll.append(2)   #1 2
        print(ll.length())
        ll.travel()
    
        ll.add(3)   # 3 1 2
        ll.travel()
    
        ll.add(4) # 4 3 1 2
        ll.travel()
    
        ll.insert(0, 5)  # 5 4 3 1 2
        ll.travel()
    
        ll.insert(10, 6)  # 5 4 3 1 2  6
        ll.travel()
    
        ll.insert(3, 7)  # 5 4 3  7 1 2  6
        ll.travel()
    
        ll.remove(5)  #  4 3  7 1 2  6)
        ll.travel()
    
        ll.remove(6)  #  4 3  7 1 2
        ll.travel()
    
        ll.remove(7)  #  4 3  1 2
        ll.travel()
    
        ll.remove(4)  #  3  1 2
        ll.travel()
        ll.remove(3)  #   1 2
        ll.travel()
        ll.remove(1)  #  2
        ll.travel()
        ll.remove(2)
        ll.travel()
  • 相关阅读:
    P5468 [NOI2019]回家路线
    P1919 【模板】A*B Problem升级版(FFT快速傅里叶)
    P4390 [BOI2007]Mokia 摩基亚
    P4234 最小差值生成树
    P5459 [BJOI2016]回转寿司
    P2173 [ZJOI2012]网络
    P2163 [SHOI2007]园丁的烦恼
    P3826 [NOI2017]蔬菜
    P3327 [SDOI2015]约数个数和
    P1829 [国家集训队]Crash的数字表格 / JZPTAB
  • 原文地址:https://www.cnblogs.com/wgDream/p/7525966.html
Copyright © 2011-2022 走看看