【数据结构】java实现数据结构单循环双向链表类,泛型能添加任意类型,增删查改,头插法和尾插法

最近在自学java,刚写了C++的双链表,试着实现一下java版本的。话说C++程序员学java不得不感慨,不用释放内存是真方便。java和C++写起来感觉差不多,java的new出来的类对象是引用类型,实际上也就等于C++的指针,把它当作指针用就好了。还有JAVA居然不能运算符重载,泛型也不能传递int这样的基本类型,太坑。。。。
完整代码如下
节点类:

public class Node <T>{
	
	public Node() {
		m_nextNode =null;
		m_preNode = null;
	}
	public T m_data; //数据域
	public Node<T> m_nextNode;
	public Node<T> m_preNode;
}

链表类:

public class dbList<Type> {
	public dbList() {
		m_head = new Node<Type>();
		m_head.m_nextNode=m_head;
		m_head.m_preNode=m_head;
	}
	public void push_back(Type value)
	{
		Node<Type> node = new Node<Type>();
		node.m_data=value;
		node.m_preNode = m_head.m_preNode;//后继节点指向头节点的后继节点指向的节点
		node.m_nextNode = m_head;     //前驱节点指向头节点
		//头节点的后继节点也就是当前链表的尾部节点,将尾部节点的前驱节点指向node
		m_head.m_preNode.m_nextNode= node;  
		m_head.m_preNode = node; //头节点的后继节点指向node
	}
	//从头部插入元素
	public void push_front(Type value)
	{
		Node<Type> node = new Node<Type>();
		node.m_data = value;
		node.m_nextNode = m_head.m_nextNode;  //当前新增节点的前驱节点指向头节点的前驱节点
		node.m_preNode = m_head;    //当前新增节点的后继节点指向头节点

		m_head.m_nextNode.m_preNode = node; //头节点的前驱节点的后继节点指向当前新增节点
		m_head.m_nextNode = node;           //头节点的前驱节点指向当前新增节点	
	}
	//从双向循环链表中删除元素,删除第一个出现的指定元素
	public void deleteFirst(Type value)
		{
			Node<Type> node = m_head.m_nextNode;
			while (node!= m_head)
			{
				if (node.m_data==value)
				{
					//待删除节点的后继节点的前驱节点指向待删除节点的前驱节点
					node.m_preNode.m_nextNode = node.m_nextNode;  
					//待删除节点的前驱节点的后继节点指向待删除节点的后继节点
					node.m_nextNode.m_preNode = node.m_preNode;
					return;
				}
				node = node.m_nextNode;
			}
		}	
		//从双向循环链表中删除所有指定元素
	public void deleteAll(Type value) 
		{
			Node<Type> node = m_head.m_nextNode;
			while (node != m_head)
			{
				if (node.m_data == value)
				{
					//待删除节点的后继节点的前驱节点指向待删除节点的前驱节点
					node.m_preNode.m_nextNode = node.m_nextNode; 
						//待删除节点的前驱节点的后继节点指向待删除节点的后继节点
					node.m_nextNode.m_preNode = node.m_preNode;
					node = node.m_preNode;   //将node移动到上一节点
				}
				node = node.m_nextNode;
			}
		}
	public int size() 
		{
			Node<Type> node = m_head.m_nextNode;
			int listSize = 0;
			while (node != m_head)
			{
				node = node.m_nextNode;
				listSize++;
			}
			return listSize;
		}
	public int findFirst(Type value, int pos)
		{
			if (pos < 0 || pos>= this.size() ) return -1;
			Node<Type> posNode = m_head.m_nextNode; //指向pos所在位置的指针
			for (int i=0;i<=pos;i++)
			{
				posNode = posNode.m_nextNode;
			}
			int valuePos = 0;
			while (posNode != m_head)
			{
				if (posNode.m_data == value)
				{
					return valuePos+1;
				}
				valuePos++;
				posNode = posNode.m_nextNode;
			}
			return -1;

		}
	public void printfAll()
		{
			Node<Type> node = m_head.m_nextNode;
			String str=new String();
			while (node != m_head)
			{
				str+=node.m_data.toString();
				str+=" ";
				node = node.m_nextNode;
			}
			System.out.println(str);
		}
	private Node<Type> m_head;
}

测试类

dbList<Integer> list =new dbList<Integer>();
		
		list.push_back(22);
		list.push_back(222);
		list.push_back(212);
		list.push_back(32);
		list.push_back(32);
		list.push_back(22);
		list.push_front(112);
		list.printfAll();
		System.out.println("32第一次出现的位置是:"+list.findFirst(32, 0));
		list.deleteFirst(222);
		list.printfAll();
		list.deleteAll(22);
		list.printfAll();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值