java中的顺序链表,单链表,双链表,循环链表

今天昨天学了集合框架,但是在List接口下有两个子类涉及到了链表,书上又提到了一个关键的词“双向循环链表”,折腾了一整天终于搞懂了。

首先我们得明白什么是链表,链表是环环相扣的一组数据,而我们常用的数组就是一组顺序链表,在分配内存时内存将对数组分配一组”连续的内存空间“而这个内存空间是固定的是程序启动前就设定好的大小,但是这样做的弊端就是当对数组分配1000的内存空间若只用了很少的一部分多余的部分也会占用内存,但是单链表很好的解决了这一问题。

单链表

链表内部的存储实现是利用递归的方式进行储存的,链表中的每一个对象都是一个节点(Node),而每个节点对象中都存在一个数据对象(data)和存储下一个节点对象的节点对象(next),利用next节点对象实现链表之间的关联。

代码如下:

先创建一个节点对象类

package 单链表的实现;

public class Node{
	public Object data;//用来存储对象数据
	public Node next;//用来存储下一个节点对象
}

再创建一个list用来实现单链表

package 单链表的子我实现;

import java.util.Collection;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.Spliterator;
import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.function.UnaryOperator;
import java.util.stream.Stream;

public class list{
	private Node head;

	public list()
	{
		head=new Node();
	}
	public void traverse()
	{
		Node temp=head;
		while(temp.next!=null)
		{
			temp=temp.next;
			System.out.println(temp.data);
		}
	}
	public boolean add(Object e) {
		// TODO Auto-generated method stub
		Node temp=head;//将头部对象赋值给临时对象,没有头部将无法遍历链表
		//利用递归执行循环,当下一个节点对象为空时停止循环
		/**
		*注意!!
		*data中存储的是当前对象,而next存储的是下一个对象
		*temp=temp.next是将temp的下一个对象赋值给temp
		*/
		while(temp.next!=null)
		{
			//将对象的下一个对象赋值给现有的临时对象
			//此时被赋值的temp节点对象同样拥有next对象
			//依次类推就形成了单链表
			temp=temp.next;
		}
		Node next=new Node();
		next.data=e;
		temp.next=next;
		return true;
	}

	public Object get(int index) {
		// TODO Auto-generated method stub
		Node temp=head;
		int i=0;
		while(temp.next!=null)
		{
			if(i==index)
			{
				return temp.data;
			}
			i++;
		}
		return null;
	}
	public void add(int index, Object element) {
		// TODO Auto-generated method stub
		Node temp=head;
		Node Element=new Node();
		Element.data=element;
		int i=0;
		while(temp.next!=null)
		{
			if(i==index)
			{
				Node node=temp.next;
				temp.next=Element;
				Element=node;
			}
			i++;
		}
	}	
}

再创建一个测试类

package 单链表的子我实现;

public class Test {
	public static void main(String[] args)
	{
		list list=new list();
		list.add("张三");
		list.add("李四");
		list.add("王武");
		list.add("赵六");
		list.traverse();
	}
}

运行结果如下:

由于时间的缘故,先写下单链表,之后更新。

猜你喜欢

转载自blog.csdn.net/qq_40929531/article/details/80575902
今日推荐