设计链表的五个接口:
-
获取链表第index个节点的数值
-
在链表的最前面插入一个节点
-
在链表的最后面插入一个节点
-
在链表第index个节点前面插入一个节点
-
删除链表的第index个节点
//定义结点
public class ListNode {
int val;
ListNode next;
public ListNode(){};
public ListNode(int val){
this.val = val;
}
public ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
}
class MyLinkedList {
int size;
ListNode dummy;
//初始化链表
//定义了一个虚拟头结点
public MyLinkedList() {
size = 0;
dummy = new ListNode(0);
}
//获得第index个结点的数值
//注意index是从0开始的,第0个结点就是头结点
public int get(int index) {
if (index < 0 || index >= size) return -1;
ListNode cur = dummy;
for (int i = 0; i <= index; i ++) cur = cur.next;
return cur.val;
}
// 在链表最前面插入一个结点
public void addAtHead(int val) {
ListNode newNode = new ListNode(val);
//新结点指向虚拟结点的下一个
newNode.next = dummy.next;
//虚拟结点指向新结点
dummy.next = newNode;
size++;
}
public void addAtTail(int val) {
ListNode newNode = new ListNode(val);
ListNode cur = dummy;
while (cur.next != null) {
cur = cur.next;
}
cur.next = newNode;
size++;
}
public void addAtIndex(int index, int val) {
//如果index大于链表的长度,则返回空
if (index > size) return;
//如果index小于0,则置为0,作为链表的新头结点
if (index < 0) index = 0;
//插入结点
ListNode newNode = new ListNode(val);
ListNode cur = dummy;
while (index != 0) {
cur = cur.next;
index --;
}
newNode.next = cur.next;
cur.next = newNode;
size++;
}
public void deleteAtIndex(int index) {
if (index >= size || index < 0) return;
size --;
ListNode cur = dummy;
/*
for (int i = 0; i < index; i ++) {
cur = cur.next;
}
*/
while (index != 0) {
cur = cur.next;
index --;
}
cur.next = cur.next.next;
}
}
/**
* 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);
*/