Java双链表的头插和尾插

双链表的头插法和尾插法——

头插图

在这里插入图片描述

尾插图

在这里插入图片描述

头插和尾插同时使用时,需要把头插产生的链表和尾插产生的链表连接起来。上面两个图片可以说明,有两个节点是无论如何都保持不变的。它们分别是 头插入法创建的第一个节点,和尾插法的头节点。当头插法的第一个节点的指针指向尾插法的头节点,此时的单链表既可以使用头插法,也可以使用尾插法。

实现类

package best;

public class SingleLinked<V> {
	Node<V> first;
	Node<V> last;
	
	Node<V> appendFirst;
	int size;
	//节点类  (静态内部类)
	public static class Node<V>{
		V value;
		Node<V> next;
		
		public Node(V value) {
			super();
			this.value = value;
		}
		public Node(V value,Node<V> next) {
			super();
			this.value = value;
			this.next = next;
		}
		
	}
	//遍历,从前往后遍历插入的元素,直到遍历到尾元素(尾元素的最后一个节点为null)
	public void forEach() {
		for (Node<V> node = first; node != null; node = node.next) {
			System.out.println(node.value);
		}
	}

//	头插  先进后出
	public boolean beforeAdd(V val){
		if( first==null ){
			first = new Node<V>(val);  
			 //记录第一次创建的头节点
			appendFirst = first;  
			return true;
		}
		
		//头插法 新插入的元素  指向单链表的头节点
		Node<V> newNode = new Node<>(val,first);
		//新插入的元素  变更为头节点
		first = newNode;
	
		size++;
		return true;
	}
	
	// 尾插  先进先出
	public boolean afterAdd(V val) {
		//如果第一个元素是空  就通过头插法创建头节点
		if( first==null ){
			return beforeAdd(val);
		}
		//如果尾节点为空,则创建的这个节点就是尾节点
		if ( last==null ){
			Node<V> newNode = new Node<V>(val,null);
			last = newNode;
			//把记录的   第一个创建的头节点  的指针  指向 第一个创建的尾节点
			appendFirst.next = last;
			return true;
		}
		//如果尾节点的下一个节点为空  那么为尾节点的指针  指向 新插入的节点
		if( last.next==null ){
			 Node<V> newNode= new Node<V>(val,null);
			 last.next = newNode;
			 //新插入的节点被记录为  尾节点
			 last = newNode;
		}
		size++;
		return true;
	}
	//获取指定下标的元素
	public V get(int index) {
		//如果下标越界 则抛出异常
		if (index < 0 || index > size)
			throw new IndexOutOfBoundsException("下标越界");
		//如果 获取的下标为0  则获取头节点
		if (index == 0) {
			return first.value;
		}
		//通过传入的index 找到要查找的节点
		Node<V> node = first;
		for (int i = 0; i < index; i++) {
			node = node.next;
		}
		//把这个节点的value作为返回值返回
		return node.value;
	}

}

测试类

package best;


public class TestLinked {
	public static void main(String[] args) {
//		testBeforeAdd();		//测试头插法
//		testAfterAdd();			//测试尾插法
		testBeforeAndLastAdd();  //测试头插和尾插同时使用
	}
	
	public static void testBeforeAdd(){
		SingleLinked<String> myLinkedList = new SingleLinked<>();
		//头插  先进后出
		myLinkedList.beforeAdd("张飞");
		myLinkedList.beforeAdd("关羽");
		myLinkedList.beforeAdd("刘备");
		//遍历
		myLinkedList.forEach();
		
	}
	public static void testAfterAdd(){
		SingleLinked<String> myLinkedList = new SingleLinked<>();
		//尾插  先进先出
		myLinkedList.afterAdd("刘备");
		myLinkedList.afterAdd("关羽");
		myLinkedList.afterAdd("张飞");
		//遍历
		myLinkedList.forEach();
		System.out.println("-------------以下为get方法测试---------------");
		System.out.println("第2个用户的名字为"+myLinkedList.get(1));
	}
	public static void testBeforeAndLastAdd(){
		SingleLinked<String> myLinkedList = new SingleLinked<>();
		//尾插
		myLinkedList.afterAdd("关羽");
		myLinkedList.afterAdd("张飞");
		//头插
		myLinkedList.beforeAdd("刘备");
		//遍历
		myLinkedList.forEach();
		
	}
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值