LeetCode算法題-Design LinkedList(Java實現)

這是悅樂書的第300次更新,第319篇原創

01 看題和準備

今天介紹的是LeetCode算法題中Easy級別的第168題(順位題號是707)。設計鏈表的實現。您可以選擇使用單鏈表或雙鏈表。單鏈表中的節點應該具有兩個屬性:val 和 next。val 是當前節點的值,next 是指向下一個節點的指針/引用。如果要使用雙向鏈表,則還需要一個屬性 prev 以指示鏈表中的上一個節點。假設鏈表中的所有節點都是 0-index 的。在鏈表類中實現這些功能:

get(index):獲取鏈表中第 index 個節點的值。如果索引無效,則返回-1。

addAtHead(val):在鏈表的第一個元素之前添加一個值爲 val 的節點。插入後,新節點將成爲鏈表的第一個節點。

addAtTail(val):將值爲 val 的節點追加到鏈表的最後一個元素。

addAtIndex(index,val):在鏈表中的第 index 個節點之前添加值爲 val 的節點。如果 index 等於鏈表的長度,則該節點將附加到鏈表的末尾。如果 index 大於鏈表長度,則不會插入節點。

deleteAtIndex(index):如果索引 index 有效,則刪除鏈表中的第 index 個節點。


例如:

MyLinkedList linkedList = new MyLinkedList();
linkedList.addAtHead(1);
linkedList.addAtTail(3);
linkedList.addAtIndex(1,2); //鏈表變爲1-> 2-> 3
linkedList.get(1); //返回2
linkedList.deleteAtIndex(1); //現在鏈表是1-> 3
linkedList.get(1); //返回3

注意

  • 所有值都在 [1, 1000] 之內。

  • 操作次數將在 [1, 1000] 之內。

  • 請不要使用內置的 LinkedList 庫。

本次解題使用的開發工具是eclipse,jdk使用的版本是1.8,環境是win7 64位系統,使用Java語言編寫和測試。

02 解題

使用單鏈表,建立指向表頭,表尾的節點,記錄表尾節點是用作當在尾部進行add操作時,不需要再遍歷一次。

    Node head=null;
    Node tail=null;
    int len=0;
    public MyLinkedList() {
        head=new Node();
        tail=new Node();
    }
    public int get(int index) {
        if (index >= 0 && index < len) {
            Node p = head.next;
            int i = 0;
            while (p != null) {
                if (i == index) {
                    return p.val;
                }
                p = p.getNext();
                i++;
            }
        }
        return -1;
    }
    public void addAtHead(int val) {
        Node node=new Node();
        node.setVal(val);
        if(head.next != null){
            Node p=head.next;
            node.next=p;
            head.next=node;
        }else{
            head.next=node;
            tail=node;
        }
        len++;
    }
    public void addAtTail(int val) {
         Node node=new Node();
         node.setVal(val);
        if(head.next==null){
            head.next=node;
            tail=head.next;
        }else{
            tail.next=node;
            tail=tail.next;
        }
        len++;
    }
    public void addAtIndex(int index, int val) {
        if(index > len){
            return;
        }
        if(index == len){
            addAtTail(val);
            return;
        }
        if(index == 0){
            addAtHead(val);
            return;
        }
        Node node=new Node();
        node.setVal(val);

        Node p = head.next;
        int i = 0;
        while (p!=null && i != index-1) {
            p = p.getNext();
            i++;
        }
        if(p!=null){
            Node q=p.next;
            p.next=node;
            node.next=q;
            len++;
        }
    }
    public void deleteAtIndex(int index) {
        if (index >= 0 && index < len) {
            if(index==0){
                if(head.next!=null){
                    head.next=head.next.next;
                    len--;
                }
                return ;
            }
            Node p = head.next;
            int i = 0;
            while (p!=null && i != index-1) {
                p = p.getNext();
                i++;
            }
            if(p!=null && p.next!=null){
                p.next=p.next.next;
                --len;
                if(i==len-1){
                    tail =p;
                }
            }
        }
    }


03 小結

算法專題目前已日更超過四個月,算法題文章168+篇,公衆號對話框回覆【數據結構與算法】、【算法】、【數據結構】中的任一關鍵詞,獲取系列文章合集。

以上就是全部內容,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支持!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章