zoukankan      html  css  js  c++  java
  • 数据结构与算法-python描述-单向循环链表

    # coding:utf-8
    
    # 单向循环链表的相关操作:
    # is_empty() 判断链表是否为空
    # length() 返回链表的长度
    # travel() 遍历
    # add(item) 在头部添加一个节点
    # append(item) 在尾部添加一个节点
    # insert(pos, item) 在指定位置pos添加节点
    # remove(item) 删除一个节点
    # search(item) 查找节点是否存在
    
    
    class Node(object):
        """节点"""
    
        def __init__(self, item):
            self.elem = item
            self.next = None
    
    
    class SingleCycleLinkedList(object):
        """单向循环链表"""
    
        def __init__(self, node=None):
            self.__head = node
            # 如果node不为空,则需要指向自己构成一个循环链表
            if node:
                node.next = node
    
        def is_empty(self):
            """判断链表是否为空"""
            return self.__head is None
    
        def length(self):
            """返回链表的长度"""
            if self.is_empty():
                return 0
            else:
                cur = self.__head
                count = 1
    
                while cur.next is not self.__head:
                    count += 1
                    cur = cur.next
    
                return count
    
        def travel(self):
            """遍历"""
            if self.is_empty():
                return
            else:
                cur = self.__head
    
                while cur.next is not self.__head:
                    print(cur.elem, end=" ")
                    cur = cur.next
    
                # 循环结束,cur指向尾节点,但是尾节点元素尚未打印,需要单独输出
                print(cur.elem)
    
        def add(self, item):
            """在头部添加一个节点,头插法"""
            node = Node(item)
    
            if self.is_empty():
                self.__head = node
                node.next = node
            else:
                # 需要获取到尾节点
                cur = self.__head
                while cur.next is not 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 is not self.__head:
                    cur = cur.next
                cur.next = node
                node.next = self.__head
    
        def insert(self, pos, item):
            """在指定位置pos添加节点"""
            if pos <= 0:
                self.add(item)
            elif pos > (self.length() - 1):
                self.append(item)
            else:
                node = Node(item)
                prev = self.__head
                count = 0
                while count < pos - 1:
                    count += 1
                    prev = prev.next
                # 循环结束,prev指向要插入位置的前一个元素
                node.next = prev.next
                prev.next = node
    
        def remove(self, item):
            """删除一个节点,需要考虑链表是否为空,删除的节点是头节点,尾节点,还是中间节点"""
            if self.is_empty():
                return
            else:
                cur = self.__head
                pre = None
    
                while cur.next is not self.__head:
                    if cur.elem == item:
                        # 判断是头节点,还是中间节点
                        if cur is self.__head:
                            # 头节点,需要找到尾节点
                            rear = self.__head
                            while rear.next is not self.__head:
                                rear = rear.next
                            self.__head = cur.next
                            rear.next = self.__head
                        else:
                            # 中间节点
                            pre.next = cur.next
    
                        return
                    else:
                        pre = cur
                        cur = cur.next
    
                # 退出循环,cur指向尾节点
                if cur.elem == item:
                    # 注意判断链表中是否只有一个节点
                    if cur is self.__head:
                        self.__head = None
                    else:
                        pre.next = self.__head
    
        def search(self, item):
            """查找节点是否存在"""
            if self.is_empty():
                return False
            else:
                cur = self.__head
                while cur.next is not self.__head:
                    if cur.elem == item:
                        return True
                    else:
                        cur = cur.next
                # 循环结束,cur指向尾节点,但是尾节点并未参与比较,需要单独进行判断的
                if cur.elem == item:
                    return True
                else:
                    return False
    
    
    if __name__ == "__main__":
        scll = SingleCycleLinkedList()
    
        print("befor initialized:", scll.is_empty())
        print("befor initialized:", scll.length())
    
        scll.add(1)
        scll.add(2)
        scll.add(3)
        scll.add(4)
        scll.add(5)
        scll.add(6)
        scll.travel()
    
        scll.append(7)
        scll.travel()
    
        scll.insert(3, 99)
        scll.travel()
    
        print("scll.search(99):", scll.search(99))
    
        scll.remove(99)
        scll.travel()
    
  • 相关阅读:
    (转载)C++ string中find() ,rfind() 等函数 用法总结及示例
    UVA 230 Borrowers (STL 行读入的处理 重载小于号)
    UVA 12100 打印队列(STL deque)
    uva 12096 The SetStack Computer(STL set的各种库函数 交集 并集 插入迭代器)
    uva 1592 Database (STL)
    HDU 1087 Super Jumping! Jumping! Jumping!
    hdu 1176 免费馅饼
    HDU 1003 Max Sum
    转战HDU
    hust 1227 Join Together
  • 原文地址:https://www.cnblogs.com/coderwjq/p/7323823.html
Copyright © 2011-2022 走看看