數(shù)據(jù)結構與算法—單向循環(huán)鏈表传趾、雙向鏈表

單向循環(huán)鏈表

? ? ? ?單鏈表的一個變形是單向循環(huán)鏈表,鏈表中最后一個節(jié)點的next域不再為None泥技,而是指向鏈表的頭節(jié)點浆兰。

image.png

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

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 Fasle
        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.remove(1)

雙向鏈表

? ? ? ?一種更復雜的鏈表是“雙向鏈表”店茶。每個節(jié)點有兩個鏈接:一個指向前一個節(jié)點蜕便,當此節(jié)點為第一個節(jié)點時,指向空值忽妒;而另一個指向下一個節(jié)點玩裙,當此節(jié)點為最后一個節(jié)點時,指向空值段直。

image.png

操作
is_empty()鏈表是否為空
length()鏈表長度
travel()遍歷鏈表
add(item)鏈表頭部添加
append(item)鏈表尾部添加
insert(pos,item)指定位置添加
remove(item)刪除節(jié)點
search(item)查找節(jié)點是否存在
實現(xiàn)

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

class DlinkList(object):
    """雙向鏈表"""
    def __init__(self):
        self._head = None

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

    def length(self):
        """返回鏈表的長度"""
        cur = self._head
        count = 0
        while cur != None:
            count += 1
            cur = cur.next
        return count

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

    def add(self,item):
        """頭部插入元素"""
        node = Node(item)
        if self.is_empty():
            self._head = node
        else:
            #將node的next指向_head的頭節(jié)點
            node.next = self._head
            #將_head的頭節(jié)點的prev指向node
            self._head.prev = node
            #將_head指向node
            self._head = node
    def append(self,item):
        """尾部插入元素"""
        node = Node(item)
        if self.is_empty():
            #如果是空鏈表吃溅,將__head指向node
            self._head = node
        else:
            #移動到鏈表尾部
            cur = self._head
            while cur.next != None:
                cur = cur.next
            #將尾節(jié)點cur的next指向node
            cur.next = node
            #將node的prev指向cur
            node.prev = cur
    def search(self,item):
        """查找元素是否存在"""
        cur = self._head
        while cur != None:
            if cur.item == item:
                return True
            cur = cur.next
        return False

    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的prev指向cur
            node.prev = cur
            #將node的next指向cur的下一個節(jié)點
            node.next = cur.next
            #將cur的下一個節(jié)點的prev指向node
            cur.next.prev = node
            #將cur的next指向node
            cur.next = node
            
    def remove(self,item):
        """刪除元素"""
        if self.is_empty():
            return
        else:
            cur = self._head
            if cur.item == item:
                #如果首節(jié)點的元素即是要刪除的元素
                if cur.next == None:
                    #如果鏈表只有一個節(jié)點
                    self._head = None
                else:
                    #將第二個節(jié)點的prev設置為None
                    cur.next.prev = None
                    #將_head指向第二個節(jié)點
                    self._head = cur.next
                return
            while cur != None:
                if cur.item == item:
                    #將cur的前一個節(jié)點的next指向cur的后一個節(jié)點
                    cur.prev.next = cur.next
                    #將cur的后一個節(jié)點的prev指向cur的前一個節(jié)點
                    cur.next.prev = cur.prev
                    break
                cur = cur.next
if __name__ == "__main__":
    ll = DlinkList()
    ll.add(1)
    ll.add(2)
    ll.append(3)
    ll.insert(2,4)
    ll.insert(4,5)
    ll.insert(0,6)
    ll.travel()
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市鸯檬,隨后出現(xiàn)的幾起案子决侈,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赖歌,死亡現(xiàn)場離奇詭異枉圃,居然都是意外死亡,警方通過查閱死者的電腦和手機庐冯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門孽亲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人展父,你說我怎么就攤上這事返劲。” “怎么了栖茉?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵篮绿,是天一觀的道長。 經(jīng)常有香客問我吕漂,道長亲配,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任惶凝,我火速辦了婚禮吼虎,結果婚禮上梨睁,老公的妹妹穿的比我還像新娘鲸睛。我一直安慰自己,他們只是感情好坡贺,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布官辈。 她就那樣靜靜地躺著,像睡著了一般遍坟。 火紅的嫁衣襯著肌膚如雪拳亿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天愿伴,我揣著相機與錄音肺魁,去河邊找鬼。 笑死隔节,一個胖子當著我的面吹牛鹅经,可吹牛的內容都是我干的。 我是一名探鬼主播怎诫,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼瘾晃,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了幻妓?” 一聲冷哼從身側響起蹦误,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后强胰,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體舱沧,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年偶洋,在試婚紗的時候發(fā)現(xiàn)自己被綠了熟吏。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡涡真,死狀恐怖分俯,靈堂內的尸體忽然破棺而出肾筐,到底是詐尸還是另有隱情哆料,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布吗铐,位于F島的核電站东亦,受9級特大地震影響,放射性物質發(fā)生泄漏唬渗。R本人自食惡果不足惜典阵,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望镊逝。 院中可真熱鬧壮啊,春花似錦、人聲如沸撑蒜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽座菠。三九已至狸眼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間浴滴,已是汗流浹背拓萌。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留升略,地道東北人微王。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像品嚣,于是被迫代替她去往敵國和親炕倘。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內容