递归思想:基本和老师您在课程中说讲的思想一致。
并且我这里的代码是不使用虚拟头节点的代码
1.这下面是我自己写的增操作的代码,这里我有一个小疑问:
public void add(int index, E e){
if(index < 0 && index > size)
throw new IllegalArgumentException("index is illegal");
this.head = add(index, e, this.head);
size ++;
}
public Node add(int index, E e, Node head){
if(index == 0){
head = new Node(e, head);
}
else{
Node res = add(index - 1, e, head.next);
head.next = res;
}
return head;
}
在第一个add中,为什么add(index, e, this.head)前面必须要有this.head呢?事实上我去掉这个this.head之后,增加元素时链表会一直是NULL,并且最后还会报NullPointer的异常。而我在问答区搜索了一下,看了别人的解答,却不需要添加这样的代码,以下是我搜索到的代码:
public void add(E e, int index) {
if (index < 0 || index > size) {
throw new IllegalArgumentException("LinkedList.add failed, index is illegal!");
}
Node<E> previous = dummyHead;
addWithRecursiton(e, previous, 0, index);
size++;
}
/**
*
* @param e 待添加的元素
* @param previous 指定插入索引的前一节点
* @param current 当前递归索引
* @param index 指定添加索引
*/
private void addWithRecursiton(E e, Node<E> previous, int current, int index){
if (current == index){
previous.next = new Node(e, previous.next);
return;
}
addWithRecursiton(e, previous.next, current + 1, index);
}
2.这下面是我自己写的删除操作的代码:
public void remove(int index){
if(index < 0 && index >= size)
throw new IllegalArgumentException("the index is illegal");
this.head = remove(index, this.head);
size --;
}
public Node remove(int index, Node head){
if(index == 0){
Node delNode = head;
head = delNode.next;
delNode.next = null;
}
else{
Node res = remove(index - 1, head.next);
head.next = res;
}
return head;
}
这里的代码有一个比较大的问题,就是按我这种返回Node型变量的递归函数做的话我无法保存删除节点的元素值,请问该怎么修改代码以解决这个问题呢?