9.雙向鏈表DoubleLinkList

目錄:
1.雙向鏈表的定義
2.雙向鏈表的圖解
3.雙向鏈表定義操作
4.雙向鏈表的實(shí)現(xiàn)

1.雙向鏈表的定義

每個(gè)節(jié)點(diǎn)有兩個(gè)鏈接:一個(gè)指向前一個(gè)節(jié)點(diǎn),當(dāng)此節(jié)點(diǎn)為第一個(gè)節(jié)點(diǎn)時(shí),指向空值裙士;而另一個(gè)指向下一個(gè)節(jié)點(diǎn)第股,當(dāng)此節(jié)點(diǎn)為最后一個(gè)節(jié)點(diǎn)時(shí)薪贫,指向空值

2.雙向鏈表的圖解

雙向鏈表.jpg

3.雙向鏈表定義操作

is_empty() 鏈表是否為空
length() 鏈表長度
travel() 遍歷整個(gè)鏈表
add(item) 鏈表頭部添加元素
append(item) 鏈表尾部添加元素
insert(pos, item) 指定位置添加元素
remove(item) 刪除節(jié)點(diǎn)
search(item) 查找節(jié)點(diǎn)是否存在

4.雙向鏈表的實(shí)現(xiàn)

4.1 結(jié)點(diǎn)的實(shí)現(xiàn)
class DoubleNode(object):
    """雙向鏈表節(jié)點(diǎn)"""
    def __init__(self, item):
        self.item = item
        self.next = None
        self.prev = None
4.2 雙向鏈表的實(shí)現(xiàn)

鏈表初始化:

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

插入元素:

# 頭插法
    def add(self, item):
        node = DoubleNode(item)
        if self.is_empty():
            # 如果是空鏈表,將_head指向node
            self._head = node
        else:
            # 將node的next指向_head的頭節(jié)點(diǎn)
            node.next = self._head
            # 將_head的頭節(jié)點(diǎn)的prev指向node
            self._head.prev = node
            # 將_head 指向node
            self._head = node


# 尾插法
    def append(self, item):
        node = DoubleNode(item)
        if self.is_empty():
            # 如果是空鏈表,將_head指向node
            self._head = node
        else:
            # 移動到鏈表尾部
            cur = self._head
            while cur.next != None:
                cur = cur.next
            # 將尾節(jié)點(diǎn)cur的next指向node
            cur.next = node
            # 將node的prev指向cur
            node.prev = cur


# 任意位置插入
    def insert(self, pos, item):
        if pos <= 0:
            self.add(item)
        elif pos > (self.length()-1):
            self.append(item)
        else:
            node = DoubleNode(item)
            cur = self._head
            count = 0
            # 移動到指定位置的前一個(gè)位置
            while count < (pos-1):
                count += 1
                cur = cur.next
            # 將node的prev指向cur
            node.prev = cur
            # 將node的next指向cur的下一個(gè)節(jié)點(diǎn)
            node.next = cur.next
            # 將cur的下一個(gè)節(jié)點(diǎn)的prev指向node
            cur.next.prev = node
            # 將cur的next指向node
            cur.next = node

鏈表元素的遍歷:

# 判斷鏈表是否為空
    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


#遍歷整個(gè)鏈表
    def travel(self):
        cur = self._head
        while cur != None:
            print(cur.item,end=' ')
            cur = cur.next
        print("")

結(jié)點(diǎn)刪除和查找

#刪除結(jié)點(diǎn)
    def remove(self, item):
        if self.is_empty():
            return
        else:
            cur = self._head
            if cur.item == item:
                # 如果首節(jié)點(diǎn)的元素即是要?jiǎng)h除的元素
                if cur.next == None:
                    # 如果鏈表只有這一個(gè)節(jié)點(diǎn)
                    self._head = None
                else:
                    # 將第二個(gè)節(jié)點(diǎn)的prev設(shè)置為None
                    cur.next.prev = None
                    # 將_head指向第二個(gè)節(jié)點(diǎn)
                    self._head = cur.next
                return
            while cur != None:
                if cur.item == item:
                    # 將cur的前一個(gè)節(jié)點(diǎn)的next指向cur的后一個(gè)節(jié)點(diǎn)
                    cur.prev.next = cur.next
                    # 將cur的后一個(gè)節(jié)點(diǎn)的prev指向cur的前一個(gè)節(jié)點(diǎn)
                    cur.next.prev = cur.prev
                    break
                cur = cur.next


#結(jié)點(diǎn)查找,返回bool值
    def search(self, item):
        cur = self._head
        while cur != None:
            if cur.item == item:
                return True
            cur = cur.next
        return False

4.3測試
if __name__ == "__main__":
    dll = DoubleLinkList()
    print(dll.is_empty())
    dll.add(1)
    print(dll.is_empty())
    dll.travel()
    dll.add(2)
    dll.append(3)
    print(dll.is_empty())
    dll.travel()
    dll.insert(2, 4)
    dll.travel()
    print("length:{}".format(dll.length()))
    print(dll.search(3))
    print(dll.search(5))
    dll.remove(1)
    print("length:{}".format(dll.length()))
    dll.travel()

# 運(yùn)行結(jié)果
True
False
1 
False
2 1 3 
2 1 4 3 
length:4
True
False
length:3
2 4 3
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末辆童,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子惠赫,更是在濱河造成了極大的恐慌把鉴,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件儿咱,死亡現(xiàn)場離奇詭異庭砍,居然都是意外死亡场晶,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門怠缸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來峰搪,“玉大人,你說我怎么就攤上這事凯旭。” “怎么了使套?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵罐呼,是天一觀的道長。 經(jīng)常有香客問我侦高,道長嫉柴,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任奉呛,我火速辦了婚禮计螺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘瞧壮。我一直安慰自己登馒,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布咆槽。 她就那樣靜靜地躺著陈轿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪秦忿。 梳的紋絲不亂的頭發(fā)上麦射,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天,我揣著相機(jī)與錄音灯谣,去河邊找鬼潜秋。 笑死,一個(gè)胖子當(dāng)著我的面吹牛胎许,可吹牛的內(nèi)容都是我干的峻呛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼呐萨,長吁一口氣:“原來是場噩夢啊……” “哼杀饵!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起谬擦,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤切距,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后惨远,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谜悟,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡话肖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了葡幸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片最筒。...
    茶點(diǎn)故事閱讀 39,779評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蔚叨,靈堂內(nèi)的尸體忽然破棺而出床蜘,到底是詐尸還是另有隱情,我是刑警寧澤蔑水,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布邢锯,位于F島的核電站,受9級特大地震影響搀别,放射性物質(zhì)發(fā)生泄漏丹擎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一歇父、第九天 我趴在偏房一處隱蔽的房頂上張望蒂培。 院中可真熱鬧,春花似錦榜苫、人聲如沸护戳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽灸异。三九已至,卻和暖如春羔飞,著一層夾襖步出監(jiān)牢的瞬間肺樟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工逻淌, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留么伯,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓卡儒,卻偏偏與公主長得像田柔,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子骨望,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評論 2 354

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