1. 程式人生 > >單向循環鏈表

單向循環鏈表

list() print 測試 單向循環鏈表 lse DC klist elif AC

寫給自己看的筆記, 很多坑

標準版

技術分享圖片
class Node(object):
    def __init__(self, item):
        self.elem = item
        self.next = None


class xunhuanLinkList(object):
    def __init__(self, node=None):
        self.__head = 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 != self.__head: count += 1 cur = cur.next return count
def tarvel(self): if self.is_empty(): return "空鏈表" else: cur = self.__head while cur.next != self.__head: print(cur.elem, end=(" ")) cur = cur.next print(cur.elem, 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 self.is_empty and pos <= 0: self.add(item) elif pos >= (self.length() - 1): 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 search(self, item): if self.is_empty(): return False else: cur = self.__head while cur.next != self.__head: if cur.elem == item: return True else: cur = cur.next if cur.elem == item: return True return False def remove(self, item): if self.is_empty(): return False else: cur = self.__head pro = None while cur.next != self.__head: if cur.elem == item: if cur == self.__head: weiba = self.__head while weiba.next != self.__head: weiba = weiba.next self.__head = cur.next weiba.next = self.__head else: pro.next = cur.next return else: pro = cur cur = cur.next if cur.elem == item: if cur == self.__head: self.__head = None else: pro.next = cur.next
View Code

註釋版

技術分享圖片
class Node(object):
    def __init__(self, item):
        # 這是一個節點類,內部的初始化函數, 此類的每一個實例對象都會擁有此函數內部的屬性
        # 創建一個節點, 此節點包含元素域,next域
        self.elem = item
        self.next = None


class xunhuanLinkList(object):
    def __init__(self, node=None):
        # 這是一個鏈表類, 內部的初始化函數, 此類的每一個實例獨享都會擁有此函數內部的屬性
        self.__head = node
        # 創建頭節點, node = None, 鏈表默認的node指向None, 以傳遞進來的node為準
        if node:
            # 如果node不為空, node的next域指向node(自身)
            node.next = node
        # 如果node為空, node的next域指向None
    """self.is_empty() 等價於 self.__head == None"""
    """cur.next != self.__head, 該條件是判斷此節點是否為鏈表的未節點"""

    def is_empty(self):
        # 判斷是否為空
        return self.__head is None
        # 如果self.__head頭節點指向None,代表該鏈表為空, 返回True
        # 反之, 返回False

    def length(self):
        # 判斷鏈表的償付
        if self.is_empty():
            # 如果鏈表為空
            return 0
        else:
            # 鏈表不為空
            cur = self.__head
            # 創建遊標cur, 指向頭節點
            count = 1
            # 以計數的方式來計算長度
            while cur.next != self.__head:
                # cur.next != self.__head, 該條件是如果不是最後一個節點, 則一直循環
                count += 1
                # 計數加一
                cur = cur.next
                # 遊標向後移動一位
            return count
            # 註意: 當循環結束後, 遊標指向最後一個節點,
            # 註意: 當鏈表只有一個節點的時候,怎麽辦

    def tarvel(self):
        # 遍歷列表
        if self.is_empty():
            # 如果鏈表為空直接返回
            return "空鏈表"
        else:
            # 如果鏈表不為空
            cur = self.__head
            # 創建遊標
            while cur.next != self.__head:
                # 如果不是尾節點, 則一直循環
                print(cur.elem, end=(" "))
                # 循環一次打印一下, 當前節點的值
                cur = cur.next
                # 遊標後移一位
            print(cur.elem, end=" ")
            # 當循環結束的時候, 遊標指向最後一個節點, 但並沒有進入循環體, 沒有打印最後一個節點的值,
            # 所以在循環結束後, 打印一下尾節點的值
            print("")
            # 該函數指向完畢, 換行操作

    def add(self, item):
        # 鏈表頭部添加節點
        node = Node(item)
        # 創建一個新節點(node), 該節點的elem元素值為item
        if self.is_empty():
            # 如果鏈表為空
            node.next = node
            # 該節點的next域指向自身
            self.__head = node
            # 將鏈表的頭節點指向node節點
        else:
            # 鏈表不為空
            cur = self.__head
            # 創建遊標, 尋找尾節點
            while cur.next != self.__head:
                # 如果該遊標指向的不是尾節點, 則後移一位
                cur = cur.next
            # 當循環結束後, 遊標指向尾節點
            node.next = self.__head
            # 新節點(node)的next域指向原鏈表的頭節點
            self.__head = node
            # 鏈表的頭節點指向新節點node
            cur.next = node  # 等價於cur.next = self.__head
            # 尾節點的next域, 指向鏈表的頭節點

    def append(self, item):
        # 鏈表尾部追加節點
        node = Node(item)
        # 創建一個新節點node
        if self.is_empty():
            # 鏈表為空
            self.__head = node
            # 將鏈表的頭部指向新節點node
            node.next = node
            # node的next域指向node(自身)
        else:
            cur = self.__head
            # 創建遊標
            while cur.next != self.__head:
                # 如果不是最後一個節點, 則一直循環
                cur = cur.next
                # 遊標後移一位
            node.next = self.__head
            # 將node的next域, 指向鏈表的頭部
            cur.next = node  # 等價於 cur.next = self.__head(上步代碼標識node為鏈表的頭節點)
            # 尾節點的next域,指向鏈表的頭節點

    def insert(self, pos, item):
        # 指定位置,插入元素
        if self.is_empty and pos <= 0:
            # 如果鏈表為空或者pos指定位置小於0, 則執行在鏈表頭部添加節點
            self.add(item)
        elif pos >= (self.length() - 1):
            # 如果指定位置, 大於尾節點的下標, 則執行尾部追加
            self.append(item)
        else:
            cur = self.__head
            # 創建遊標
            count = 0
            # 以計數的方式找到指定下標處
            while count != (pos - 1):
                # 找到指定下標節點的前驅節點處
                count += 1
                # 計數加一
                cur = cur.next
                # 遊標後移
            node = Node(item)
            # 創建一個新節點node
            node.next = cur.next
            # 循環結束後, 遊標指向, 指定下標的前驅節點位置處
            # 讓node的next域指向, 遊標cur節點的後繼節點處
            cur.next = node
            # 讓遊標cur節點的next域, 指向新節點node

    def search(self, item):
        # 查找元素
        if self.is_empty():
            # 如果鏈表為空, 返回False
            return False
        else:
            # 反之
            cur = self.__head
            # 創建遊標
            while cur.next != self.__head:
                # 遍歷所有元素
                if cur.elem == item:
                    # 如果遊標指向的當前節點的elem元素等於要查找的元素, 返回True
                    return True
                else:
                    # 如果沒有找到, 遊標後移一位
                    cur = cur.next
            # 循環結束後, 遊標指向最後一個節點, 該節點並沒有進入循環體內, 所以要判斷最後一個元素是否為要查找的item
            if cur.elem == item:
                return True
            return False
        # 註意點: 1. 鏈表為空, 2. 鏈表只有一個節點 3. item為最後一個節點

    def remove(self, item):
        # 鏈表為空
        # 鏈表只有一個節點
        # 要查找的元素是首節點
        # 要查找的元素是尾節點
        if self.is_empty():
            # 如果鏈表為空, 返回False
            return False
        else:
            # 鏈表不為空
            cur = self.__head
            pro = None
            # 創建兩個遊標, cur當前元素, pro前驅元素
            while cur.next != self.__head:
                # 遍歷元素到尾節點
                if cur.elem == item:
                    # 找到item的節點
                    if cur == self.__head:
                        # 首節點
                        weiba = self.__head
                        while weiba.next != self.__head:
                            weiba = weiba.next
                        # 循環結束遊標weiba指向尾節點
                        self.__head = cur.next
                        weiba.next = self.__head

                    else:
                        # 中間節點
                        pro.next = cur.next
                    # 當找到item節點之後, 執行完代碼直接退出
                    return
                else:
                    pro = cur
                    cur = cur.next
            # 循環結束後cur指向尾節點
            if cur.elem == item:
                if cur == self.__head:
                    # 鏈表只有一個節點
                    self.__head = None
                else:
                    pro.next = cur.next
View Code

測試代碼

技術分享圖片
if __name__ == "__main__":
    tll = xunhuanLinkList()
    print(tll.is_empty())
    print(tll.length())
    tll.append(1)
    tll.tarvel()
    print(tll.is_empty())
    print(tll.length())
    tll.add(2)
    tll.tarvel()
    tll.append(1)
    tll.tarvel()
    tll.add(100)
    tll.tarvel()
    tll.append(2)
    tll.append(4)
    tll.append(5)
    tll.append(6)
    tll.tarvel()
    tll.insert(1, 3)
    tll.tarvel()
    print(tll.search(2))
    print(tll.search(900))
    tll.remove(3)
    tll.tarvel()
    tll.remove(2)
    tll.tarvel()
    tll.remove(1)
    tll.tarvel()
    print(tll.search(1))
    print(tll.search(10))
View Code

單向循環鏈表