【leetcode=鏈表】設(shè)計(jì)鏈表

【leetcode=鏈表】設(shè)計(jì)鏈表

題目:

設(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ù)。

java代碼:

public class MyLinkedList {
 
    Node first, last;
    int size;
 
    /** Initialize your data structure here. */
    public MyLinkedList() {
        
    }
    
    /** Get the value of the index-th node in the linked list. If the index is invalid, return -1. */
    public int get(int index) {
        if (index < 0 || index >= size)
            return -1;
        else
            return node(index).val;
    }
    
    /** 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. */
    public void addAtHead(int val) {
        linkFirst(val);
    }
    
    /** Append a node of value val to the last element of the linked list. */
    public void addAtTail(int val) {
        linkLast(val);
    }
    
    /** 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. */
    public void addAtIndex(int index, int val) {
        if (index < 0 || index > size)
            return;        
        if (index == size)
            linkLast(val);
        else
            linkBefore(val, node(index));
    }
    
    /** Delete the index-th node in the linked list, if the index is valid. */
    public void deleteAtIndex(int index) {
        if (index < 0 || index >= size)
            return;
        unlink(node(index));
    }
    
    void linkBefore(int val, Node succ) {
        Node pred = succ.prev;
        Node newNode = new Node(pred, val, succ);
        succ.prev = newNode;
        if (pred == null)
            first = newNode;
        else 
            pred.next = newNode;        
        size++;
    }
    
    void linkFirst(int val) {
        Node f = first;
        Node newNode = new Node(null, val, f);
        first = newNode;
        if (f == null)
            last = newNode;
        else
            f.prev = newNode;        
        size++;
    }
    
    void linkLast(int val) {
        Node l = last;
        Node newNode = new Node(l, val, null);
        last = newNode;
        if (l == null)
            first = newNode;
        else
            l.next = newNode;
        size++;
    }
    
    void unlink(Node x) {
        Node prev = x.prev;
        Node next = x.next;
        
        if (prev == null) {
            first = next;
        } else {
            prev.next = next;
            x.prev = null;
        }
        
        if (next == null) {
            last = prev;
        } else {
            next.prev = prev;
            x.next = null;
        }
        
        size--;
    }
    
    Node node(int index) {
        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;
        }
    }
        
    static class Node {
        int val;
        Node prev, next;
        
        Node (Node prev, int val, Node next) {
            this.val = val;
            this.prev = prev;
            this.next = next;
        }
    }
        
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末油湖,一起剝皮案震驚了整個(gè)濱河市巍扛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌乏德,老刑警劉巖撤奸,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異喊括,居然都是意外死亡胧瓜,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)郑什,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)府喳,“玉大人,你說(shuō)我怎么就攤上這事蘑拯《勐” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵申窘,是天一觀的道長(zhǎng)弯蚜。 經(jīng)常有香客問(wèn)我,道長(zhǎng)剃法,這世上最難降的妖魔是什么熟吏? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮玄窝,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘悍引。我一直安慰自己恩脂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布趣斤。 她就那樣靜靜地躺著俩块,像睡著了一般。 火紅的嫁衣襯著肌膚如雪浓领。 梳的紋絲不亂的頭發(fā)上玉凯,一...
    開(kāi)封第一講書(shū)人閱讀 52,394評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音联贩,去河邊找鬼漫仆。 笑死,一個(gè)胖子當(dāng)著我的面吹牛泪幌,可吹牛的內(nèi)容都是我干的盲厌。 我是一名探鬼主播署照,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼吗浩!你這毒婦竟也來(lái)了建芙?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤懂扼,失蹤者是張志新(化名)和其女友劉穎禁荸,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體阀湿,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡赶熟,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了炕倘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钧大。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖罩旋,靈堂內(nèi)的尸體忽然破棺而出啊央,到底是詐尸還是另有隱情,我是刑警寧澤涨醋,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布瓜饥,位于F島的核電站,受9級(jí)特大地震影響浴骂,放射性物質(zhì)發(fā)生泄漏乓土。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一溯警、第九天 我趴在偏房一處隱蔽的房頂上張望趣苏。 院中可真熱鬧,春花似錦梯轻、人聲如沸食磕。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)彬伦。三九已至,卻和暖如春伊诵,著一層夾襖步出監(jiān)牢的瞬間单绑,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工曹宴, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留搂橙,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓笛坦,卻偏偏與公主長(zhǎng)得像份氧,于是被迫代替她去往敵國(guó)和親唯袄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359