package Study.Collection;
/**
* <p>Description: </p>
* 插入结点,add()方法实现
* @author zhangyan
* @date 2018/12/23 9:44
*/
public class YanLinkedList03 {
private Node first;
private Node last;
private int size;
public void add(int index, Object obj) {
//定义新节点newNode
Node newNode = new Node(obj);
//找到索引对应的节点temp
Node temp = getNode(index);
if(temp!=null){
Node up = temp.previous;
if(index==size){ //最后一个元素
last.next = newNode;
newNode.previous = last;
}
if(index==0){ //第一个元素
newNode.next = first;
first.previous = newNode;
}else { //正常情况下
up.next = newNode;
newNode.previous = up;
newNode.next = temp;
temp.previous = newNode;
}
}
}
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){
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);
return temp!=null?temp.element:null;
}
public Node getNode(int index){
Node temp = null;
if(index<=(size>>1)){ //size>>1相当于除以2
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{
node.previous = last;
node.next = null;
last.next = node;
last = node;
}
size++;
}
@Override
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) {
YanLinkedList03 list = new YanLinkedList03();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
list.add("f");
System.out.println(list);
list.add(0,"baba");
System.out.println(list);
}
}
解析:add()方法和remove()方法差不多,都是先找到索引对应的节点,然后更改前继和后驱节点。
当然索引index的位置要做判断,分为最后一个 元素,第一个元素和中间。