每日一題——設計連結串列
設計連結串列的實現。您可以選擇使用單鏈表或雙鏈表。單鏈表中的節點應該具有兩個屬性: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 庫。
public class MyLinkedList { public Node head; public int count; public MyLinkedList(){ head = new Node(0); count = 0; } public int get(int index) { if(index < 0 || index >= count) return -1; int size = 0; Node first = head.next; while(size++ != index) { first = first.next; } return first.val; } public void addAtHead(int val) { Node cur = new Node(val); Node first = head.next; cur.next = first; head.next = cur; count++; } public void addAtTail(int val) { Node cur = new Node(val); Node first = head.next; while(first.next != null) { first = first.next; } first.next = cur; count++; } public void addAtIndex(int index, int val) { Node cur = new Node(val); Node first = head.next; int length = 0; if(first == null) return; while(length < index - 1) { first = first.next; length++; } if(first.next == null) { first.next = cur; count++; }else{ cur.next = first.next; first.next = cur; count++; } } public void deleteAtIndex(int index) { Node first = head; int length = 0; while(first != null) { if(length == index - 1) break; first = first.next; length++; } first.next = first.next.next; count--; } }
結點類:
class Node{
int val;
Node next;
Node(int x){
val = x;
next = null;
}
}