707.设计链表
题目:
代码:
能通过测试,但是提交不通过,不想改了。。。体会下虚拟头节点意思意思好了。
class ListNode{
public ListNode next;
public int val;
public ListNode(int val, ListNode next){
this.next = next;
this.val = val;
}
public ListNode(){}
public ListNode(int val){
this.val = val;
}
}
class MyLinkedList {
int size;
ListNode head; // 虚拟头节点
public MyLinkedList() {
size = 0;
this.head = new ListNode(0);
}
public int get(int index) {
if(index >= size || index < 0){
return -1;
}
ListNode cur = head;
for(int i = 0; i <= index; i++){ // 由于包含了虚拟头节点,所以有等号
cur = cur.next;
}
return cur.val;
}
public void addAtHead(int val) {
head.next = new ListNode(val, head.next);
size ++;
}
public void addAtTail(int val) {
ListNode cur = head;
while(cur.next != null){
cur = cur.next;
}
cur.next = new ListNode(val);
size ++;
}
public void addAtIndex(int index, int val) {
ListNode cur = head;
if(index < 0 || index > size){return;}
if(index == size){
addAtTail(val);
size++;
return;
}
for(int i = 0; i < index; i++){ // 包含虚拟头节点,但是不是找index而是找它的前置
cur = cur.next;
}
cur.next = new ListNode(val, cur.next);
size++;
}
public void deleteAtIndex(int index) {
if(index >= size || index < 0){return;}
ListNode cur = head;
for(int i = 0; i < index; i++)
cur = cur.next;
cur.next = cur.next.next;
size--;
}
}
/**
* Your MyLinkedList object will be instantiated and called as such:
* MyLinkedList obj = new MyLinkedList();
* int param_1 = obj.get(index);
* obj.addAtHead(val);
* obj.addAtTail(val);
* obj.addAtIndex(index,val);
* obj.deleteAtIndex(index);
*/