數據結構與算法-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()
相關文章
相關標籤/搜索