用Java实现链表

        在实现之前首先要知道链表为何存在的?其实链表是由数组转换而来,所谓数组就是用来存储同种数据类型的集合,他在内存中是一块连续的存储空间,如果数组仅用来存和取数据的话,那不得不说是一个很好的东西。但是这往往不能满足人们的需求,数组它的长度是固定的,再对其里面的元素进行操作的时候,很麻烦,所以就诞生了链表。

     链表其实就打破了数组的这种局限性,它的长度不是固定的,在内存中也不是一块连续的存储空间,那么链表是靠什么来维持线性关系的呢,那就是通过指针,把一个节点分成两部分,一部分保存数据(数据域),一部分保存下一个节点的地址(指针域),它在内存中的存储形式如下图。

其实在Java中,它的指针域就是存放的该种类,那么该如何来实现代码呢,首先需要一个头指针,然后创建节点

	public void createNewNode(int a){
		Node n = new Node(a);			//创建一个新的节点
		n.next = head;                  //头节点是空的,第一次调用就默认成为了尾节点,这里使用的是头插法
		head = n;                    //然后使头节点指向这里
	}

这里使用的是头插法,每调用一次,生成的节点都是在链表的最前端,还有一种尾插法,这里就不详述了。

删除一个节点,

	//删除一个节点
	public boolean deleteEle(int i){
		if(i < 1 || i > Length()){
			return false;
		}
		Node Temp = head;
		Node CurrNode = Temp.next;
		
		if(CurrNode == null){
			head = null;
			return true;
		}
		
		int j =1;
		while(CurrNode != null){
			if(j == i){
				Temp.next = CurrNode.next;
				CurrNode.next = null;
				return true;
			}
			Temp = CurrNode;
			CurrNode = CurrNode.next;
			j++;
		}
		return false;
	}

这里首先判断传递进来的参数是否正确,然后使用两个辅助指针变量,判断这是不是只有一个节点,如果是的话,就将它删除,如果不是,就判断,要删除第几个节点,其实基本思想很简单,首先把删除指针的指针域用一个临时变量保存起来,然后赋给前一个节点的指针域就可以了。

在链表的任意位置插入一个元素,我还是首先把基本思想说一下,要在链表中的某一个位置插入一个元素,就需要用一个临时变量,保存你插入元素的后一个节点的位置,然后把要插入节点的地址赋给当前指针的位置,然后再把临时变量赋给新节点的位置。

public boolean insertEle(int i, int data){
		if(i < 1 || i > Length()){
			return false;
		}
		
		int j = 1;
		if(i == 1){
			Node n = new Node(data); 
			n.next = head;
			head = n;
		}
		Node CurrNode = head;
		Node Tem = null;
		while(CurrNode != null){
			if(i == j){
				Node n = new Node(data);
				Tem = CurrNode.next;
				CurrNode.next = n;
				n.next = Tem;
				return true;
			}
			
			CurrNode = CurrNode.next;
			j++;
		}
		
		return false;
	}

还有一个就是打印链表和获取链表长度,其实不难,只需要从链表的头节点开始往后遍历就可以了,结束的标志就是最后一个节点的指针域为空。

猜你喜欢

转载自blog.csdn.net/xhl1123456789/article/details/89041107