设计单链表的实现
节点应该具有两种属性: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;
}
}