圖解LeetCode——707. 設計鏈表(難度:中等)

一纹蝴、題目

設計鏈表的實現(xiàn)。您可以選擇使用單鏈表或雙鏈表踪少。單鏈表中的節(jié)點應該具有兩個屬性:valnext塘安。val 是當前節(jié)點的值,next 是指向下一個節(jié)點的指針/引用援奢。如果要使用雙向鏈表兼犯,則還需要一個屬性 prev 以指示鏈表中的上一個節(jié)點。假設鏈表中的所有節(jié)點都是 0-index 的集漾。

在鏈表類中實現(xiàn)這些功能:

get(index) :獲取鏈表中第 index 個節(jié)點的值切黔。如果索引無效,則返回-1帆竹。
addAtHead(val) :在鏈表的第一個元素之前添加一個值為 val 的節(jié)點绕娘。插入后脓规,新節(jié)點將成為鏈表的第一個節(jié)點栽连。
addAtTail(val) :將值為 val 的節(jié)點追加到鏈表的最后一個元素。
addAtIndex(index,val) :在鏈表中的第 index 個節(jié)點之前添加值為 val 的節(jié)點。如果 index 等于鏈表的長度秒紧,則該節(jié)點將附加到鏈表的末尾绢陌。如果 index 大于鏈表長度,則不會插入節(jié)點熔恢。如果index小于0脐湾,則在頭部插入節(jié)點。
deleteAtIndex(index) :如果索引 index 有效叙淌,則刪除鏈表中的第 index 個節(jié)點秤掌。

二、示例

2.1> 示例:

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] 之內鹰霍。
  • 操作次數(shù)將在 [1, 1000] 之內闻鉴。
  • 請不要使用內置的 LinkedList 庫。

三茂洒、解題思路

其實這類題就是讓我們自己去實現(xiàn)容器孟岛,跟設計HashSet、設計HashMap督勺、設計Deque等等是一類題渠羞。對于Java實現(xiàn)來說,我們只需要參照LinkedList即可智哀。

當然次询,在JDK中LinkedList是采用雙向鏈表實現(xiàn)的底層邏輯。此處與單向鏈表實現(xiàn)區(qū)別不大瓷叫。

這道題就不畫圖了渗蟹,具體代碼請參照——代碼實現(xiàn)。

四赞辩、代碼實現(xiàn)

class MyLinkedList {
    private Node first = null;
    private Node last = null; 
    private int size = 0;

    public MyLinkedList() {
    }
    
    public int get(int index) {
        if (!isElementIndex(index)) return -1;
        return getNode(index).val;
    }
    
    public void addAtHead(int val) {
        Node newNode = new Node(null, val, first);
        if (first != null) first.prev = newNode;
        first = newNode;
        if (last == null) last = first;
        size++;
    }
    
    public void addAtTail(int val) {
        Node newNode = new Node(last, val, null);
        if (last != null) last.next = newNode;
        last = newNode;
        if (first == null) first = last;
        size++;
    }
    
    public void addAtIndex(int index, int val) {
        if (index > size) return;
        if (index == size) {
            addAtTail(val);
        } else if (index <= 0) {
            addAtHead(val);
        } else {
            Node node = getNode(index);
            Node newNode = new Node(node.prev, val, node);
            if (node.prev != null) node.prev.next = newNode;
            node.prev = newNode;
            size++;
        }   
    }
    
    public void deleteAtIndex(int index) {
        if (!isElementIndex(index)) return;
        Node node = getNode(index);
        if (index == 0) {
            first = node.next;
            if (size > 1) node.next.prev = null;
            node.next = null;
        } else if (index == size - 1) {
            last = node.prev;
            if (size > 1) node.prev.next = null;
            node.prev = null;
        } else {
            node.prev.next = node.next;
            node.next.prev = node.prev;
        }     
        size--;
    }

    private boolean isElementIndex(int index) {
        return index >= 0 && index < size;
    }

    public Node getNode(int index) {
        if (!isElementIndex(index)) return null;
        if (index < (size >> 1)) {
            Node x = first;
            for (int i = 0; i < index; i++)
                x = x.next;
            return x;
        } else {
            Node x = last;
            for (int i = size - 1; i > index; i--)
                x = x.prev;
            return x;
        }
    }

    private static class Node {
        int val;
        Node next, prev;
        Node(Node prev, int val, Node next) {
            this.val = val;
            this.next = next;
            this.prev = prev;
        }
    }
}

今天的文章內容就這些了:

寫作不易雌芽,筆者幾個小時甚至數(shù)天完成的一篇文章,只愿換來您幾秒鐘的 點贊 & 分享 辨嗽。

更多技術干貨世落,歡迎大家關注公眾號“爪哇繆斯” ~ \(o)/ ~ 「干貨分享,每天更新」

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末糟需,一起剝皮案震驚了整個濱河市屉佳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌洲押,老刑警劉巖武花,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異杈帐,居然都是意外死亡体箕,警方通過查閱死者的電腦和手機专钉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來累铅,“玉大人跃须,你說我怎么就攤上這事⊥奘蓿” “怎么了菇民?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長投储。 經(jīng)常有香客問我第练,道長,這世上最難降的妖魔是什么玛荞? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任复旬,我火速辦了婚禮,結果婚禮上冲泥,老公的妹妹穿的比我還像新娘驹碍。我一直安慰自己,他們只是感情好凡恍,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布志秃。 她就那樣靜靜地躺著,像睡著了一般嚼酝。 火紅的嫁衣襯著肌膚如雪浮还。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天闽巩,我揣著相機與錄音钧舌,去河邊找鬼。 笑死涎跨,一個胖子當著我的面吹牛洼冻,可吹牛的內容都是我干的。 我是一名探鬼主播隅很,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼撞牢,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了叔营?” 一聲冷哼從身側響起屋彪,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎绒尊,沒想到半個月后畜挥,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡婴谱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年蟹但,在試婚紗的時候發(fā)現(xiàn)自己被綠了躯泰。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡矮湘,死狀恐怖斟冕,靈堂內的尸體忽然破棺而出口糕,到底是詐尸還是另有隱情缅阳,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布景描,位于F島的核電站十办,受9級特大地震影響,放射性物質發(fā)生泄漏超棺。R本人自食惡果不足惜向族,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望棠绘。 院中可真熱鬧件相,春花似錦、人聲如沸氧苍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽让虐。三九已至紊撕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間赡突,已是汗流浹背对扶。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留惭缰,地道東北人浪南。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像漱受,于是被迫代替她去往敵國和親逞泄。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內容