package Study.Collection;
/**
* <p>Description: </p>
* 增加get()方法,结点遍历
* @author zhangyan
* @date 2018/12/20 15:37
*/
public class YanLinkedList01 {
private Node first;
private Node last;
private int size;
public Object get(int index) {
//判断索引是否在范围内
if(index<0||index>size-1){
throw new RuntimeException("索引数字不合法:"+index);
}
Node temp = null;
//如果index在前半部分,就从头开始找
if(index<=(size>>1)){ //size>>1相当于除以2
temp = first; //从first结点开始
for(int i=0;i<index;i++){
temp = temp.next;
}
}else{ //如果index在后半部分,就从最后一个开始找
temp = last; //从last结点开始
for(int i=size-1; i>index;i--){
temp = temp.previous;
}
}
//返回对应的结点的值
return temp.element;
}
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++;
}
@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) {
YanLinkedList01 list = new YanLinkedList01();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
list.add("f");
System.out.println(list.get(5));
}
}
解释:get()方法实现的思路是,根据索引值遍历链表,然后返回对应的节点值。
当然遍历链表有一个优化算法在里面,就是对索引index进行判断,如果在前半部分就在前半部分遍历链表,如果在后半部分就在后半部分遍历链表。