python LeetCode-707: 設(shè)計(jì)鏈表

1.題目描述:

設(shè)計(jì)鏈表的實(shí)現(xiàn)誉券。您可以選擇使用單鏈表或雙鏈表击吱。單鏈表中的節(jié)點(diǎn)應(yīng)該具有兩個(gè)屬性:val 和 next虑椎。val 是當(dāng)前節(jié)點(diǎn)的值榆鼠,next 是指向下一個(gè)節(jié)點(diǎn)的指針/引用纲爸。如果要使用雙向鏈表,則還需要一個(gè)屬性 prev 以指示鏈表中的上一個(gè)節(jié)點(diǎn)妆够。假設(shè)鏈表中的所有節(jié)點(diǎn)都是 0-index 的识啦。

在鏈表類(lèi)中實(shí)現(xiàn)這些功能:

get(index):獲取鏈表中第 index 個(gè)節(jié)點(diǎn)的值。如果索引無(wú)效责静,則返回-1袁滥。
addAtHead(val):在鏈表的第一個(gè)元素之前添加一個(gè)值為 val 的節(jié)點(diǎn)。插入后灾螃,新節(jié)點(diǎn)將成為鏈表的第一個(gè)節(jié)點(diǎn)。
addAtTail(val):將值為 val 的節(jié)點(diǎn)追加到鏈表的最后一個(gè)元素揩徊。
addAtIndex(index,val):在鏈表中的第 index 個(gè)節(jié)點(diǎn)之前添加值為 val 的節(jié)點(diǎn)腰鬼。如果 index 等于鏈表的長(zhǎng)度,則該節(jié)點(diǎn)將附加到鏈表的末尾塑荒。如果 index 大于鏈表長(zhǎng)度熄赡,則不會(huì)插入節(jié)點(diǎn)。如果index小于0齿税,則在頭部插入節(jié)點(diǎn)彼硫。
deleteAtIndex(index):如果索引 index 有效,則刪除鏈表中的第 index 個(gè)節(jié)點(diǎn)凌箕。

示例:

MyLinkedList linkedList = new MyLinkedList();
linkedList.addAtHead(1);
linkedList.addAtTail(3);
linkedList.addAtIndex(1,2); //鏈表變?yōu)?-> 2-> 3
linkedList.get(1); //返回2
linkedList.deleteAtIndex(1); //現(xiàn)在鏈表是1-> 3
linkedList.get(1); //返回3

提示:

所有val值都在 [1, 1000] 之內(nèi)拧篮。
操作次數(shù)將在 [1, 1000] 之內(nèi)。
請(qǐng)不要使用內(nèi)置的 LinkedList 庫(kù)牵舱。

2.分析

設(shè)計(jì)鏈表串绩,因?yàn)檫@里有非常多的關(guān)于鏈表長(zhǎng)度的判斷,所以關(guān)鍵點(diǎn)在于我們的鏈表需要保存一個(gè)鏈表的長(zhǎng)度芜壁,避免每次刪除或者讀鏈表時(shí)不必要的長(zhǎng)度判斷礁凡。

3.解決

#
# @lc app=leetcode.cn id=707 lang=python3
#
# [707] 設(shè)計(jì)鏈表
#

# @lc code=start
class MyLinkedList:
    """
    這道題目的關(guān)鍵在于,可以通過(guò)size屬性來(lái)獲取本鏈表的長(zhǎng)度慧妄,避免在一些刪除和添加操作時(shí)顷牌,還需要去遍歷整個(gè)鏈
    表看是否符合要求
    """

    def __init__(self):
        """
        Initialize your data structure here.
        """
        self.dummy_head = ListNode(0)
        self.size = 0

    def get(self, index: int) -> int:
        """
        Get the value of the index-th node in the linked list. If the index is invalid, return -1.
        """
        # todo 易錯(cuò)點(diǎn),index = self.size也是非法的index
        if index < 0 or index >= self.size:
            return -1

        cur_node = self.dummy_head
        for _ in range(index+1):
            cur_node = cur_node.next
        
        return cur_node.val

    def addAtHead(self, val: int) -> None:
        """
        Add a node of value val before the first element of the linked list. After the insertion, the new node will be the first node of the linked list.
        """
        self.addAtIndex(0, val)

    def addAtTail(self, val: int) -> None:
        """
        Append a node of value val to the last element of the linked list.
        """
        self.addAtIndex(self.size, val)

    def addAtIndex(self, index: int, val: int) -> None:
        """
        Add a node of value val before the index-th node in the linked list. If index equals to the length of linked list, the node will be appended to the end of linked list. If index is greater than the length, the node will not be inserted.
        """
        if index > self.size:
            return
        
        if index < 0:
            index = 0
        
        pre_node = self.dummy_head

        for _ in range(index):
            pre_node = pre_node.next
        
        self.size += 1
        
        tmp_node = ListNode(val)
        tmp_node.next = pre_node.next
        pre_node.next = tmp_node

    def deleteAtIndex(self, index: int) -> None:
        """
        Delete the index-th node in the linked list, if the index is valid.
        """
        # todo index = self.size也是非法的
        if index < 0 or index >= self.size:
            return

        pre_node = self.dummy_head

        for _ in range(index):
            pre_node = pre_node.next
        
        pre_node.next = pre_node.next.next

        self.size -= 1

# Your MyLinkedList object will be instantiated and called as such:
# obj = MyLinkedList()
# param_1 = obj.get(index)
# obj.addAtHead(val)
# obj.addAtTail(val)
# obj.addAtIndex(index,val)
# obj.deleteAtIndex(index)
# @lc code=end


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末塞淹,一起剝皮案震驚了整個(gè)濱河市窟蓝,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌窖铡,老刑警劉巖疗锐,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坊谁,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡滑臊,警方通過(guò)查閱死者的電腦和手機(jī)口芍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)雇卷,“玉大人鬓椭,你說(shuō)我怎么就攤上這事」鼗” “怎么了小染?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)贮折。 經(jīng)常有香客問(wèn)我裤翩,道長(zhǎng),這世上最難降的妖魔是什么调榄? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任踊赠,我火速辦了婚禮,結(jié)果婚禮上每庆,老公的妹妹穿的比我還像新娘筐带。我一直安慰自己,他們只是感情好缤灵,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布伦籍。 她就那樣靜靜地躺著,像睡著了一般腮出。 火紅的嫁衣襯著肌膚如雪帖鸦。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,031評(píng)論 1 285
  • 那天利诺,我揣著相機(jī)與錄音富蓄,去河邊找鬼。 笑死慢逾,一個(gè)胖子當(dāng)著我的面吹牛立倍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播侣滩,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼口注,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了君珠?” 一聲冷哼從身側(cè)響起寝志,我...
    開(kāi)封第一講書(shū)人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后材部,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體毫缆,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年乐导,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了苦丁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡物臂,死狀恐怖旺拉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情棵磷,我是刑警寧澤蛾狗,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站仪媒,受9級(jí)特大地震影響沉桌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜规丽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一蒲牧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧赌莺,春花似錦、人聲如沸松嘶。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)翠订。三九已至巢音,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間尽超,已是汗流浹背官撼。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留似谁,地道東北人傲绣。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像巩踏,于是被迫代替她去往敵國(guó)和親秃诵。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

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

  • 707 Design Linked List 設(shè)計(jì)鏈表 Description:Design your imple...
    air_melt閱讀 381評(píng)論 0 0
  • 題目 設(shè)計(jì)鏈表的實(shí)現(xiàn)塞琼。您可以選擇使用單鏈表或雙鏈表菠净。單鏈表中的節(jié)點(diǎn)應(yīng)該具有兩個(gè)屬性:val 和 next。val ...
    佟佳寧閱讀 134評(píng)論 0 0
  • 【leetcode=鏈表】設(shè)計(jì)鏈表 題目: 設(shè)計(jì)鏈表的實(shí)現(xiàn)。您可以選擇使用單鏈表或雙鏈表毅往。單鏈表中的節(jié)點(diǎn)應(yīng)該具有兩...
    程序員小2閱讀 211評(píng)論 0 1
  • 707. 設(shè)計(jì)鏈表 設(shè)計(jì)鏈表的實(shí)現(xiàn)牵咙。您可以選擇使用單鏈表或雙鏈表。單鏈表中的節(jié)點(diǎn)應(yīng)該具有兩個(gè)屬性:val 和 ne...
    TheKey_閱讀 224評(píng)論 0 0
  • 題目描述: 設(shè)計(jì)鏈表的實(shí)現(xiàn)攀唯。您可以選擇使用單鏈表或雙鏈表洁桌。單鏈表中的節(jié)點(diǎn)應(yīng)該具有兩個(gè)屬性:val 和 next。v...
    華子24閱讀 259評(píng)論 0 0