链表存储java实现

顺序存储

线性表可以采用顺序存储,也就是用数组存储,这个方法虽然简单但是优缺点如下:

1. 插入耗费时间,O(n),若正好插入第一位,那么就正好移动N个元素,平均值n/2

2.  删除耗费时间,O(n),若删除的元素正好在第一位,那么就正好移动N-1个元素,平均值n-1/2

3.  取元素,比较简单,O(1),比如取第3个

4.  总结,增删查改,增删耗费时间,查改节省时间

链式存储

单连表分为两种

1. 双向链表(Double linked list)更加普遍,易删除,但占用空间

2. 单向链表(Single linked list)不太普遍,不易删除,但节省空间

双向链表实现

1. 插入(insert)

head指针,prev == null 的为head,head为单独的一个存储指针,用于指向链表的头部。若无特殊要求,插入操作默认在头部进行。因为在头部插入更加高效O(1),如果是尾部O(n)

2. 删除(remove)

直接跳过要删除的node节点即可

Node类

class Node
{
	int value;
	Node pre;
	Node next;
	Node(int key)
	{
		pre = null;
		next = null;
		value = key;
	}
}

双向链表类

public class DoubleLinkedList {
	Node head;
	public DoubleLinkedList()
	{
		head = null;
	}
	public boolean isEmpty() 
	{
		if (head == null) 
		{
			return true;
		}
		else 
		{
			return false;
		}
	}
	public Node search(int key) throws Exception 
	{
		Node ret = null;
		Node temp = head;
		if (isEmpty()) {
			throw new Exception("The list is Empty!");
		}
		else {
			while(temp != null) 
			{
				if (temp.value == key) 
				{
					ret = temp;
				}
				else 
				{
					temp = temp.next;
				}
			}
			return ret;	
		}
	}
	public void insert(Node node) throws Exception 
	{
		if (node == null) 
		{
			throw new Exception("The node is null!");
		}
		else 
		{
			if (isEmpty()) 
			{
				head = node;
			}
			else 
			{
				head.pre = node;
				node.next = head;
				node.pre = null;
				head = node;
			}
			
		}
	}
	public void print()throws Exception 
	{
		if(isEmpty())
		{
			throw new Exception("The list is null!");
		}
		else 
		{
			Node temp = head;
			while(temp != null) 
			{
				System.out.println(temp.value);
				temp = temp.next;
			}
		}
	}
	public void remove(Node node) throws Exception 
	{
		if (node.pre != null) 
		{
			node.pre.next = node.next;
		}
		else 
		{
			head = node.next;
		}
		if (node.next != null) 
		{
			node.next.pre = node.pre;
		}
		else 
		{
			;
		}
	}
	public void reverse() 
	{
		Node temp = null;
		temp = head;
		while(temp != null) 
		{
			Node change = null;
			change = temp.next;
			temp.next = temp.pre;
			temp.pre = change;
			head = temp;
			temp = temp.pre;
		}
	}
	public static void main(String[] args) throws Exception 
	{
		DoubleLinkedList dl = new DoubleLinkedList();
		Node node1 = new Node(5);
		Node node2 = new Node(6);
		Node node3 = new Node(7);
		dl.insert(node1);
		dl.insert(node2);
		dl.insert(node3);
		dl.print();
		dl.reverse();
		dl.print();
		
	}
}

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值