设计单链表的实现
节点应该具有两种属性:val 和 next,val是当前节点的值,next是指向下一个节点的指针引用。
在链表类中实现一些功能:
1、get(index)
获取链表中第index节点的值,如果索引无效,则返回-1
2、addAtHead(val)
在链表的第一个元素之前添加一个值为val的节点,插入后,新的节点将成为链表的第一个节点
3、addAtTail(val)
将值为val的节点追加到链表的最后一个元素
4、addAtIndex(index,val)
在链表的第index节点之前添加值为val的节点。如果index等于链表的长度,那么节点添加到链表的末尾,
如果index大于链表长度,则不会插入节点,如果index小于0,那么在头部插入节点
5、deleteAtIndex(index)
如果索引index有效,则删除链表中的第index个节点

节点类

private class ListNode{
   int val;
   ListNode next;
   ListNode() {
   }
   ListNode(int val) {
           this.val = val;
   }
   ListNode(int val, ListNode next) {
           this.val = val;
           this.next = next;
   }
}

链表类

class MyLinkedList {
  int size;
  ListNode head;

  public MyLinkedList() {
     size = 0;
     head = new ListNode(0);
  }
  public int get(int index) {
     if (index < 0 || index >= size) return -1;
     ListNode current  = head;
     while (index > 0) {
         current = current.next;
         index --;
     }
     return current.next.val;
  }
  public void addAtIndex(int index, int val) {
     if (index > size) return;
     if (index < 0) index = 0;
     size++;
     ListNode newNode = new ListNode(val);
     ListNode prev = head;
     while (index > 0) {
         prev = prev.next;
         index --;
     }
     newNode.next = prev.next;
     prev.next = newNode;
  }
  public void addAtHead(int val) {
     addAtIndex(0, val);
  }
  public void addAtTail(int val) {
     addAtIndex(size ,val);
  }
  public void deleteAtIndex(int index) {
     if(index < 0 || index > size-1) return;
     size --;
     ListNode prev = head;
     while (index > 0) {
         prev = prev.next;
         index --;
     }
     prev.next = prev.next.next;
  }
}