链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。
数组与链表的优缺点;
数组:
优点:使用方便 ,查询效率 比链表高,内存为一连续的区域
缺点:大小固定,不适合动态存储,不方便动态添加
链表:
优点:可动态添加删除 大小可变
缺点:只能通过顺次指针访问,查询效率低
而链表作为一种数据结构也是经常被使用的
首先先写个Node 的节点类 方便以后调用
class Node {
//因为是指向节点,不能指向对象
Node prev; //上一个节点
Object obj;
Node next;//下一个节点
public Node() {
}
public Node(Node prev, Object obj, Node next) {
super();
this.prev = prev;
this.obj = obj;
this.next = next;
}
}
其次再写具体方法实现链表功能
public class MyLinkList {
private Node first;//头节点
private Node last;//尾节点
private int size;
public void add(Object obj){
Node node = new Node();//新增一个节点
if(first == null){
node.next = null;
node.obj = obj;
node.prev = null;
first = node;
last = node;
}else{
node.next = null;//新节点的下一个节点为空
node.prev = last;//上一个节点为之前的尾节点
node.obj = obj;
last.next = node;//尾节点的下一个节点为node
last = node;
}
size ++;
}
public void add(int index, Object obj){
RangeCheck(index);
Node temp = node(index);
Node newNode = new Node();
newNode.obj = obj;//赋值当前节点
if(temp!=null){
Node up = temp.prev;
up.next = newNode;//上一个节点的下一个节点为newNode
newNode.prev = up;
newNode.next = temp;
temp.prev = newNode;
}
size++;
}
//观察数组是否越界
public void RangeCheck(int index){
if(index<0||index>size){
try {
throw new Exception();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
public Node node(int index){//获得节点方法
Node temp = null;
if(first != null){
temp = first;
for(int i = 0; i < index; i++){
temp = temp.next;
}
}
return temp;
}
public Object get(int index){
RangeCheck(index);
Node temp = node(index);
if(temp != null){
return temp.obj;
}
return null;
}
public void remove(int index){
RangeCheck(index);
Node temp = node(index);
if(temp != null){
Node up = temp.prev;
Node down = temp.next;
up.next = down;
down.prev = up;
size--;
temp = null;
}
}
public void print(){
for(int i = 0; i < size; i++){
System.out.println(get(i));
}
System.out.println("-----------------");
}
public void print2(){
for(int i = size-1; i >= 0; i--){
System.out.println(get(i));
}
System.out.println("-----------------");
}
public static void main(String[] args) {
MyLinkList list = new MyLinkList();
list.add(1);
list.add(2);
list.add(3);
System.out.println(list.size);
System.out.println(list.get(1));
System.out.println("-----------------");
list.print();
list.print2();
list.add(2, 4);
list.print();
}
}
还不怎么会使用这个博客的代码输出方法,见谅。
这就是双向链表的大概形式,萌新之作,请各位指出不足之处