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 +篇,公眾號對話方塊回覆【資料結構與演算法 】、【演算法 】、【資料結構 】中的任一關鍵詞,獲取系列文章合集。
以上就是全部內容,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支援!