linkList底层是双向链表,其增加,删除速度快,但是查找慢。
增加新节点时,因为插入是有序的,所以应该进行尾插。
//添加元素
public boolean add(T e) {
Node newNode = new Node(e,null,null);
if(size == 0){
tail = head = newNode;
}else {
//新节点的直接前驱
newNode.pre = tail;
//新节点的直接后继
newNode.next = null;
//更新tail结点
tail.next = newNode;
tail = newNode;
}
size++;
return true;
}
获取元素:
public T get(int index){ Node tmp = head; if(index<0 || index>=size){ throw new RuntimeException("参数不合法"+index); }else { for (int i = 0; i < index ; i++) { tmp = tmp.next; } } return (T)tmp.data; }
链表的查找效率低,为了提高查找的效率,分两部分进行查找元素,当将元素的链表分为两部分,当查找的元素靠近头,从头开始查找,反之从尾部开始查找。
改进如下:
/**
* 获取元素,提高查找效率
* @param index
* @return
*/
public T get(int index){
if(index<0 || index>=size){
throw new RuntimeException("参数不合法"+index);
}
Node tmp = null;
if(index <= (size>>1)){ //size>>1 相当于除以2
tmp = head;
for (int i = 0; i < index ; i++) {
tmp = tmp.next;
}
}else {
tmp = tail;
for (int i = size-1; i > index ; i--) {
tmp = tmp.pre;
}
}
return (T)tmp.data;
}
删除元素:
(删除元素1)
public T remove(int index){
Node tmp = head;
if(index<0 || index>=size){
throw new RuntimeException("参数不合法"+index);
}else {
for (int i = 0; i < index ; i++) {
tmp = tmp.next;
}
}
//第一个节点
if (tmp == head){
Node temp = head.next;
head = temp;
//最后一个节点
}else if(tmp == tail) {
Node temp = tmp.pre;
tail = temp;
//中间节点
} else {
//该节点的前一个结点
Node up = tmp.pre;
//该节点的后一个节点
Node down = tmp.next;
//串接
up.next = down;
down.pre = up;
}
size--;
return (T)tmp.data;
}
代码如下:
public class MyLinkList<T> {
private Node head; //头节点
private Node tail; //尾节点
private int size; //节点个数
public MyLinkList(){
this.head = new Node((T)new Object(),null,null);
}
//结点Node类
class Node{
private Object data;//存储的元素
private Node pre; //前驱节点
private Node next; //后继节点
public Node(T value, Node pre, Node next) {
data = value;
this.pre = pre;
this.next = next;
}
}
//添加元素
public boolean add(T e) {
Node newNode = new Node(e,null,null);
if(size == 0){
tail = head = newNode;
}else {
//新节点的直接前驱
newNode.pre = tail;
//新节点的直接后继
newNode.next = null;
//更新tail结点
tail.next = newNode;
tail = newNode;
}
size++;
return true;
}
// //获取元素
// public T get(int index){
// Node tmp = head;
// if(index<0 || index>=size){
// throw new RuntimeException("参数不合法"+index);
// }else {
// for (int i = 0; i < index ; i++) {
// tmp = tmp.next;
// }
// }
// return (T)tmp.data;
// }
/**
* 获取元素,提高查找效率
* @param index
* @return
*/
public T get(int index){
if(index<0 || index>=size){
throw new RuntimeException("参数不合法"+index);
}
Node tmp = null;
if(index <= (size>>1)){ //size>>1 相当于除以2
tmp = head;
for (int i = 0; i < index ; i++) {
tmp = tmp.next;
}
}else {
tmp = tail;
for (int i = size-1; i > index ; i--) {
tmp = tmp.pre;
}
}
return (T)tmp.data;
}
//元素的个数
public int size() {
return size;
}
// 删除元素
public T remove(int index){
Node tmp = head;
if(index<0 || index>=size){
throw new RuntimeException("参数不合法"+index);
}else {
for (int i = 0; i < index ; i++) {
tmp = tmp.next;
}
}
//第一个节点
if (tmp == head){
Node temp = head.next;
head = temp;
//最后一个节点
}else if(tmp == tail) {
Node temp = tmp.pre;
tail = temp;
//中间节点
} else {
//该节点的前一个结点
Node up = tmp.pre;
//该节点的后一个节点
Node down = tmp.next;
//串接
up.next = down;
down.pre = up;
}
size--;
return (T)tmp.data;
}
public static void main(String[] args) {
MyLinkList<Integer> myLinkList = new MyLinkList();
myLinkList.add(7);
myLinkList.add(1);
myLinkList.add(2);
myLinkList.add(3);
myLinkList.add(6);
myLinkList.add(4);
myLinkList.add(10);
System.out.println("原长度:"+myLinkList.size());
System.out.println("原链表:");
for (int i = 0; i < myLinkList.size(); i++) {
System.out.print(myLinkList.get(i)+" ");
}
System.out.println();
System.out.println("删除的元素:"+myLinkList.remove(6));
System.out.println("删除的元素:"+myLinkList.remove(0));
System.out.println("后长度:"+myLinkList.size());
System.out.println("删除后链表:");
for (int i = 0; i < myLinkList.size(); i++) {
System.out.print(myLinkList.get(i)+" ");
}
System.out.println();
}
}
运行如下:





