双向链表链表

链表是一种物理存储单元上非连续、非顺序的存储结构数据元素的逻辑顺序是通过链表中的指针链接次序实现的。

数组与链表的优缺点;    

数组:

优点:使用方便 ,查询效率 比链表高,内存为一连续的区域 

缺点:大小固定,不适合动态存储,不方便动态添加
链表:

优点:可动态添加删除   大小可变   
缺点:只能通过顺次指针访问,查询效率低

而链表作为一种数据结构也是经常被使用的

首先先写个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();
 	}
}

还不怎么会使用这个博客的代码输出方法,见谅。

这就是双向链表的大概形式,萌新之作,请各位指出不足之处

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值