package Study.Collection;
/**
* <p>Description: </p>
* remove方法实现
* @author zhangyan
* @date 2018/12/20 15:53
*/
public class YanLinkedList02 {
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; //上一个结点命名为up
Node down = temp.next; //下一个结点命名为down
if(up!=null){
up.next = down;
}
if(down!=null){
down.previous = up;
}
if(index==0){ //被删除的元素是第一个元素时
first = down;
}
if(index == size-1){ //被删除的元素是最后一个元素时
last = up;
}
size--;
}
}
public Object get(int index) {
if(index<0||index>size-1){
throw new RuntimeException("索引数字不合法:"+index);
}
Node temp = getNode(index);
//temp不等于null就返回对应的值,等于null就返回null
return temp!=null?temp.element:null;
}
//封装结点
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){
first = node;
last = node;
}else{
node.previous = last;
node.next = null;
last.next = node;
last = node;
}
size++;
}
public String toString() {
//[a,b,c] first=a, last=c
//a,b,c
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 static void main(String[] args) {
YanLinkedList02 list = new YanLinkedList02();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
list.add("f");
System.out.println(list);
list.remove(3);
System.out.println(list);
list.remove(0);
System.out.println(list);
list.remove(5);
System.out.println(list);
}
}
解析:remove方法实现起来很简单,思路是
1. 获取索引index对应的节点temp;
2. 如果index对应的节点temp不为null,定义好temp上一个节点和下一个节点;
3. 然后连接节点之间,这里要注意的是要判断index是不是对应第一个元素和最后一个元素(如果是第一个元素,temp的下一个节点赋值给YanLinkedList的第一个节点;如果是最后一个元素,temp的上一个节点赋值给YanLinkedList的最后一个节点。)