JAVA实现单链表以及双向链表

  1. 单链表

SignleLinkList类--定义单链表

package cn.yundylan.collection;
//单链表的创建以及操作
public class SignleLinkList {
	private SignleNode first;
	private SignleNode last;
	private int size;
	//单链表中增加节点
	public void add(Object obj)
	{
		//判断第一个节点是否为空
		if(first==null)
		{
			SignleNode n = new SignleNode();
			n.setObj(obj);
			n.setNext(null);
			first = n;
			last = n;
			size++;
		}
		//链表已经存在,在末端插入一个节点
		else
		{
			SignleNode n = new SignleNode();
			n.setObj(obj);
			n.setNext(null);
			last.setNext(n);
			last = n;
			size++;
		}
	}
	//单链表中删除一个节点
	public void remove(Object obj)
	{
		//删除第一个节点
		if(first.getObj() == obj)
		{
			first = (SignleNode)first.getNext();
		}
		//删除最后一个节点
		else if(last.getObj()==obj)
		{
			SignleNode p = (SignleNode)first.getNext();
			while(p.getNext()!=last)//循环找到last前面的一个节点
				p =(SignleNode) p.getNext();
			p.setNext(null);
		}
		//删除中间节点
		else
		{
			SignleNode p = (SignleNode)first.getNext();
			while(p.getObj()!=obj)//循环找到需要删除的那个节点
			{
				p =(SignleNode) p.getNext();
			}
			System.out.println(p.getObj());
			SignleNode q = first;//定义一个新的节点 找到删除节点的前一个节点
			while(q.getNext()!=p)
			{
				q = (SignleNode)q.getNext();
			}
			q.setNext(p.getNext());
			
		}
	}
	public static void main(String[] args) {
		SignleLinkList list =new SignleLinkList();
		list.add("a");
		list.add("b");
		list.add("c");
		list.add("d");
		list.add("e");
		list.remove("c");
		while(list.first!=null)
		{
			System.out.println(list.first.getObj());
			list.first =(SignleNode)list.first.getNext();
		}
	}
}

SignleNode类--定义单链表结点

package cn.yundylan.collection;
//单链表中节点的定义
public class SignleNode {
	private Object obj;
	private Object next;
	public SignleNode()
	{
		
	}
	public Object getNext() {
		return next;
	}
	public void setNext(Object next) {
		this.next = next;
	}
	public Object getObj() {
		return obj;
	}
	public void setObj(Object obj)
	{
		this.obj = obj;
	}
}

2.双向链表

LinkList类--定义双向链表

package cn.yundylan.collection;
/**
 * 链表的实现以及操作
 * @author Dylan
 *
 */
public class LinkList {
//	class LinkList *list;
	private Node first;
	private Node last;
	private int size;
	//在双链表中增加一个节点
	public void add(Object obj)
	{
		//空链表
		if(first==null)
		{
			Node n = new Node();//创建一个新节点
			n.setPrevious(null);
			n.setObj(obj);//给这个节点的obj字段赋值
			n.setNext(null);
			
			first = n;
			last = n;
			size++;
		}
		else
		{
			Node n = new Node();//创建一个新节点
			n.setObj(obj);//给节点赋值
			n.setNext(null);//节点增加在链表最末端,因此其后继节点为空
			n.setPrevious(last);//当前增加的节点其前驱节点为当前链表的最后一个节点
			
			last.next = n;
			last = n;
			size++;
		}
	}
	//删除链表中的一个节点
	public void remove(Object obj)
	{
//		Node n = new Node();
//		n.setObj(obj);
		Node temp1 = new Node();
		Node temp2 = new Node();
		if(first!=null)
		{
			if(first.obj==obj)
			{
				first = (Node)first.getNext();
				first.setPrevious(null);
			}
			else if(last.obj==obj)
			{
				Node n = new Node();
				n = (Node)last.getPrevious();
				n.setNext(null);
			}
			else
			{
				Node p = (Node)first.getNext();
				
				while(p!=last)//第一个节点不为空 循环链表找到元素为obj的节点进行删除
				{
					System.out.println("执行while语句");
					System.out.println(p.getObj());
					if(p.obj==obj)
					{
						temp1 = (Node)p.getNext();
						temp2 = (Node)p.getPrevious();
						temp2.setNext(temp1);
						temp1.setPrevious(temp2);
//						System.out.println(temp1.obj);
//						System.out.println(temp2.obj);
						break;
					}
					p = (Node)p.getNext();
				}
			}
			
		}
	}
	
	public static void main(String[] args) {
		LinkList list = new LinkList();//创建一个LinkList对象
		//对链表进行赋值
		list.add("a");
		list.add("b");
		list.add("c");
		list.add("d");
		//打印链表
//		while(list.first!=null)
//		{
//			System.out.println(list.first.obj);
//			list.first =(Node) list.first.getNext();
//		}
		System.out.println(list.first.obj=="a");
		list.remove("c");
		while(list.first!=null)
		{
			System.out.println(list.first.obj);
			list.first =(Node) list.first.getNext();
		}
	}
}

Node类--定义双向链表的节点

package cn.yundylan.collection;
/**
 * 链表的实现以及操作
 * @author Dylan
 *
 */
public class LinkList {
//	class LinkList *list;
	private Node first;
	private Node last;
	private int size;
	//在双链表中增加一个节点
	public void add(Object obj)
	{
		//空链表
		if(first==null)
		{
			Node n = new Node();//创建一个新节点
			n.setPrevious(null);
			n.setObj(obj);//给这个节点的obj字段赋值
			n.setNext(null);
			
			first = n;
			last = n;
			size++;
		}
		else
		{
			Node n = new Node();//创建一个新节点
			n.setObj(obj);//给节点赋值
			n.setNext(null);//节点增加在链表最末端,因此其后继节点为空
			n.setPrevious(last);//当前增加的节点其前驱节点为当前链表的最后一个节点
			
			last.next = n;
			last = n;
			size++;
		}
	}
	//删除链表中的一个节点
	public void remove(Object obj)
	{
//		Node n = new Node();
//		n.setObj(obj);
		Node temp1 = new Node();
		Node temp2 = new Node();
		if(first!=null)
		{
			if(first.obj==obj)
			{
				first = (Node)first.getNext();
				first.setPrevious(null);
			}
			else if(last.obj==obj)
			{
				Node n = new Node();
				n = (Node)last.getPrevious();
				n.setNext(null);
			}
			else
			{
				Node p = (Node)first.getNext();
				
				while(p!=last)//第一个节点不为空 循环链表找到元素为obj的节点进行删除
				{
					System.out.println("执行while语句");
					System.out.println(p.getObj());
					if(p.obj==obj)
					{
						temp1 = (Node)p.getNext();
						temp2 = (Node)p.getPrevious();
						temp2.setNext(temp1);
						temp1.setPrevious(temp2);
//						System.out.println(temp1.obj);
//						System.out.println(temp2.obj);
						break;
					}
					p = (Node)p.getNext();
				}
			}
			
		}
	}
	
	public static void main(String[] args) {
		LinkList list = new LinkList();//创建一个LinkList对象
		//对链表进行赋值
		list.add("a");
		list.add("b");
		list.add("c");
		list.add("d");
		//打印链表
//		while(list.first!=null)
//		{
//			System.out.println(list.first.obj);
//			list.first =(Node) list.first.getNext();
//		}
		System.out.println(list.first.obj=="a");
		list.remove("c");
		while(list.first!=null)
		{
			System.out.println(list.first.obj);
			list.first =(Node) list.first.getNext();
		}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值