package hw1;
public class LinkedList implements List {
// public static void main(String[] args) {
//
// }
private Node head = null;
private int size; // 链表的节点个数,从1开始计数的哦
public void add(Object o) {
// 没有头节点,则创建头节点
if (null == head) {
head = new Node();
head.next = null;
}
// Node temp = new Node();
// temp = head.next;
Node newNode = new Node();
newNode.data = o;
newNode.next = head.next;
head.next = newNode;
size++;
}
public void add(int index, Object o) {
size++;
}
// 头节点的索引为0
public Object get(int index) {
Node ptr = new Node();
ptr = head;
// 如果index越界,则抛出异常啊?要抛出异常吗?
if (index >= size() || index < 0) {
System.out.println("要抛出异常吗?");
return null;
} else {
// 假设头节点有数据吧,节约点资源
for (int i = 0; i < index; i++) {
ptr = ptr.next;
}
}
return ptr;
}
// 删除特定索引位置的对象
public Object remove(int index) {
Node ptr = new Node();
Node temp = new Node();
ptr = head;
// 如果index越界,则抛出异常啊?要抛出异常吗?
if (index >= size() || index < 0) {
System.out.println("要抛出异常吗?");
return null;
} else {
// 假设头节点有数据吧,节约点资源
for (int i = 0; i < index; i++) {
ptr = ptr.next;
}
// 此时ptr指向的就是index这个节点,但是我们要的是前一个节点
temp = ptr.next;
ptr.next = ptr.next.next;
}
size--;
return temp;
}
public int size() {
// 隐藏的成本就是多写一个函数,没别的用途就是隐藏安全用的
return size;
}
// 因为头节点head里面也是有数据的,所以这里的插入指的是插到头前面
public void addFirst(Object o) {
// 不能发呆了
// 首先创建节点
Node ptr = new Node();
ptr.data = o;
ptr.next = head;
head = ptr;
size++;
}
// 最后一个节点指向 null嘛
public void addLast(Object o) {
Node ptr = new Node();
ptr.data = o;
ptr.next = null;
// 取尾节点,size正好比索引大一个
Node lastNode = head;
for (int i = 0; i < size-1; i++) {
lastNode = lastNode.next;
}
lastNode.next = ptr;
size++;
}
public Object removeLast() {
// 取尾节点前一个,size正好比索引大一个
Node lastNode = head;
for (int i = 0; i < size-2; i++) {
lastNode = lastNode.next;
}
lastNode.next = null;
size--;
return null;
}
public Object removeFirst() {
Node firstNode = new Node();
firstNode.next = head.next;
head = firstNode;
size--;
return null;
}
// 节点静态内部类
private static class Node {
Object data; // Object 是一个通用的类型
Node next;
}
}