(2018-04-19.Python從Zero到One)三、鏈表__3.1.2單向循環(huán)鏈表

上一篇文章為:→3.1.1單向鏈表

單向循環(huán)鏈表

單鏈表的一個變形是單向循環(huán)鏈表市咽,鏈表中最后一個節(jié)點的next域不再為None袖外,而是指向鏈表的頭節(jié)點。

day24_鏈表-01.png

操作

  • is_empty() 判斷鏈表是否為空
  • length() 返回鏈表的長度
  • travel() 遍歷
  • add(item) 在頭部添加一個節(jié)點
  • append(item) 在尾部添加一個節(jié)點
  • insert(pos, item) 在指定位置pos添加節(jié)點
  • remove(item) 刪除一個節(jié)點
  • search(item) 查找節(jié)點是否存在

實現(xiàn)

class Node(object):
    """節(jié)點"""
    def __init__(self, item):
        self.item = item
        self.next = None

class SinCycLinkedlist(object):
    """單向循環(huán)鏈表"""
    def __init__(self):
        self._head = None

    def is_empty(self):
        """判斷鏈表是否為空"""
        return self._head == None

    def length(self):
        """返回鏈表的長度"""
        # 如果鏈表為空魂务,返回長度0
        if self.is_empty():
            return 0
        count = 1
        cur = self._head
        while cur.next != self._head:
            count += 1
            cur = cur.next
        return count

    def travel(self):
        """遍歷鏈表"""
        if self.is_empty():
            return
        cur = self._head
        print cur.item,
        while cur.next != self._head:
            cur = cur.next
            print cur.item,
        print ""

    def add(self, item):
        """頭部添加節(jié)點"""
        node = Node(item)
        if self.is_empty():
            self._head = node
            node.next = self._head
        else:
            #添加的節(jié)點指向_head
            node.next = self._head
            # 移到鏈表尾部曼验,將尾部節(jié)點的next指向node
            cur = self._head
            while cur.next != self._head:
                cur = cur.next
            cur.next = node
            #_head指向添加node的
            self._head = node

    def append(self, item):
        """尾部添加節(jié)點"""
        node = Node(item)
        if self.is_empty():
            self._head = node
            node.next = self._head
        else:
            # 移到鏈表尾部
            cur = self._head
            while cur.next != self._head:
                cur = cur.next
            # 將尾節(jié)點指向node
            cur.next = node
            # 將node指向頭節(jié)點_head
            node.next = self._head

    def insert(self, pos, item):
        """在指定位置添加節(jié)點"""
        if pos <= 0:
            self.add(item)
        elif pos > (self.length()-1):
            self.append(item)
        else:
            node = Node(item)
            cur = self._head
            count = 0
            # 移動到指定位置的前一個位置
            while count < (pos-1):
                count += 1
                cur = cur.next
            node.next = cur.next
            cur.next = node

    def remove(self, item):
        """刪除一個節(jié)點"""
        # 若鏈表為空,則直接返回
        if self.is_empty():
            return
        # 將cur指向頭節(jié)點
        cur = self._head
        pre = None
        # 若頭節(jié)點的元素就是要查找的元素item
        if cur.item == item:
            # 如果鏈表不止一個節(jié)點
            if cur.next != self._head:
                # 先找到尾節(jié)點粘姜,將尾節(jié)點的next指向第二個節(jié)點
                while cur.next != self._head:
                    cur = cur.next
                # cur指向了尾節(jié)點
                cur.next = self._head.next
                self._head = self._head.next
            else:
                # 鏈表只有一個節(jié)點
                self._head = None
        else:
            pre = self._head
            # 第一個節(jié)點不是要刪除的
            while cur.next != self._head:
                # 找到了要刪除的元素
                if cur.item == item:
                    # 刪除
                    pre.next = cur.next
                    return
                else:
                    pre = cur
                    cur = cur.next
            # cur 指向尾節(jié)點
            if cur.item == item:
                # 尾部刪除
                pre.next = cur.next

    def search(self, item):
        """查找節(jié)點是否存在"""
        if self.is_empty():
            return False
        cur = self._head
        if cur.item == item:
            return True
        while cur.next != self._head:
            cur = cur.next
            if cur.item == item:
                return True
        return False

if __name__ == "__main__":
    ll = SinCycLinkedlist()
    ll.add(1)
    ll.add(2)
    ll.append(3)
    ll.insert(2, 4)
    ll.insert(4, 5)
    ll.insert(0, 6)
    print "length:",ll.length()
    ll.travel()
    print ll.search(3)
    print ll.search(7)
    ll.remove(1)
    print "length:",ll.length()
    ll.travel()

下一篇文章為:→3.1.3雙向鏈表
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鬓照,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子孤紧,更是在濱河造成了極大的恐慌豺裆,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件号显,死亡現(xiàn)場離奇詭異臭猜,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)押蚤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門蔑歌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人揽碘,你說我怎么就攤上這事次屠。” “怎么了雳刺?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵劫灶,是天一觀的道長。 經(jīng)常有香客問我掖桦,道長本昏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任枪汪,我火速辦了婚禮涌穆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘料饥。我一直安慰自己蒲犬,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布岸啡。 她就那樣靜靜地躺著原叮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上奋隶,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天擂送,我揣著相機(jī)與錄音,去河邊找鬼唯欣。 笑死嘹吨,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的境氢。 我是一名探鬼主播蟀拷,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼萍聊!你這毒婦竟也來了问芬?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤寿桨,失蹤者是張志新(化名)和其女友劉穎此衅,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體亭螟,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡挡鞍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了预烙。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片墨微。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖默伍,靈堂內(nèi)的尸體忽然破棺而出欢嘿,到底是詐尸還是另有隱情衰琐,我是刑警寧澤也糊,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站羡宙,受9級特大地震影響狸剃,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜狗热,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一钞馁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧匿刮,春花似錦僧凰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春绩鸣,著一層夾襖步出監(jiān)牢的瞬間怀大,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工呀闻, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留化借,地道東北人。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓捡多,卻偏偏與公主長得像蓖康,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子垒手,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容