将原来的up和temp之间的link打断,插入新的节点newNode,建立新的link。
增加首尾节点的插入,同时能够在插入索引越界的情况下,抛出异常。
package cn.yyq.mycollection;
public class YyqLinkedList03 {
private Node first;// 第一个节点
private Node last;// 最后一个节点
private int size;
public void remove(int index) {
Node temp = getNode(index);
if (temp!=null) {
Node up = temp.previous;
Node down = temp.next;
if (up!=null) {
up.next = down;
}
if (down!=null) {
down.previous = up;
}
if (index==0) {//up==null ,被删除的是第一个元素
first = down;//当前对象的下一个作为第一节点,可以写在if中的else里
//如果index==2, first =down 结果为0-2的索引都被删掉
}
if (index==size-1) {//down==null,被删除的是最后一个元素
last = up;//当前对象的上一个作为最后一个
}
size--;
}
}
public void add(int index,Object obj) {
Node newNode = new Node(obj);
Node temp = getNode(index);
if (index < 0 || index > size - 1) {
throw new RuntimeException("索引数字不合法:" + index);}
if(index == 0)//第一个结点插入
{
first.previous = newNode;
newNode.next = first;
newNode.previous = null;
first = newNode;
}
if(index == size-1) //最后一个节点插入
{
last.next = newNode;
newNode.previous = last;
newNode.next = null;
last = newNode;}
else {//其他部分的插入
Node up = temp.previous;
up.next = newNode;
newNode.previous = up;
temp.previous = newNode;
newNode.next = temp;
}
size++;
}
// [a,b,c]
@Override
public String toString() {// 输入toString之后跳出重写
// [a,b,c] first = a , last = c
// a,b,c
// Node temp = first;第一种输出方法,没有[],每个元素都换行
// System.out.println(temp.element);
// while (temp!= null) {
// temp = temp.next;}
// return "";
StringBuilder sb = new StringBuilder("[");
Node temp = first;
while (temp != null) {
sb.append(temp.element + ",");
temp = temp.next;// 直到为空时结束
}
sb.setCharAt(sb.length() - 1, ']');
return sb.toString();
}
public Object get(int index) {
if (index < 0 || index > size - 1) {
throw new RuntimeException("索引数字不合法:" + index);
}
Node temp = getNode(index);
return temp!=null?temp.element:null;//temp不等于空返回temp.element,否则返回为空;
}
public Node getNode(int index) { //封装在获取节点上
Node temp = null;
if (index <= (size >> 1)) {// 如果索取是前半部分从头开始找
temp = first;
for (int i = 0; i < index; i++) {
temp = temp.next;
}
} else {//如果索取是后半部分从尾开始找
temp = last;
for (int i = size - 1; i > index; i--) {
temp = temp.previous;
}
}
return temp;
}
public void add(Object obj) {
Node node = new Node(obj);
if (first == null) {// 第一次往里面放
// node.previous = null;
// node.next = null; 写不写都没有关系
first = node;
last = node;
} else {
// 第二次往里面放 ["a","b","c"]
node.previous = last;// 前一个节点是上次的最后一个
node.next = null;
last.next = node;// 新加的节点b
last = node; // last = c
}
size++;//每add一次,size++
}
public static void main(String[] args) {
YyqLinkedList03 list03 = new YyqLinkedList03();
list03.add("a");
list03.add("b");
list03.add("c");
list03.add("d");
list03.add("e");
list03.add("f");
list03.remove(5);
System.out.println(list03);
list03.remove(0);
System.out.println(list03);
list03.remove(2);
System.out.println(list03);
list03.add(2,"gg");
System.out.println(list03);
System.out.println(list03.size);
list03.add(3,"gg1");
System.out.println(list03);
}
}
输出结果为:
[a,b,c,d,e]
[b,c,d,e]
[b,c,e]
[b,c,e,gg]
4
[b,c,e,gg,gg1]