熟悉单向链表原理

链表是在数据结构中经常见到的一种形式,在Java中可以通过引用传递的方式进行实现,代码如下。

链表就好像火车车厢那样,从火车头开始,每一节车厢之后都连着后一节车厢。每一节车厢就相当于一个节点,每一个节点除了要保存自己的内容之外,还要保存下一个节点的引用。如下图所示:



增加节点肯定是在链表的最后进行增加;

查找节点肯定是依次递归的方式进行查找;

删除节点:实际上就是改变引用传递的地址;

在程序开发中必须考虑两种情况:

a,第一次执行的时候根节点不存在,需要将第一个节点设置成为根节点

b,之后执行的效果

public class Link {//链表操作类
	private Node root;//根节点
	class Node{//内部类(方便访问外部类私有属性)
		private String data;
		private Node next;
		public Node(String data){
			this.data = data;
		}
		public String getData(){
			return this.data;
		}
		public void add(Node newNode){//将节点增加到合适的位置上去
			if(this.next==null)		//判断下一个节点是否为空
				this.next = newNode;//如果为空,则把新节点设置在该位置上
			else            //如果不为空,则需要向下继续找next
				this.next.add(newNode);//在下一个位置处增加
		}
		public void delete(Node previous,String data){//删除节点
			if(data.equals(this.data))//找到匹配节点
				previous.next = this.next;//空出当前节点
			else{
				if(this.next!=null)
					this.next.delete(this, data);//继续向下找
			}
		}
		public boolean search(String data){
			if(this.data.equals(data))//判断当前节点的名字是否与查找的一致
				return true;//如果一致,返回true
			else{	//继续判断下一个
				if(this.next!=null){//下一个节点存在,则继续查找
					return this.next.search(data);//返回下一个节点的查询结果
				}else
					return false;//节点不存在
			}
		}
		public void showNode(){
			System.out.print(this.getData()+"-->");
			if(this.next!=null){//节点不为空,则继续打印
				this.next.showNode();//让下一个节点输出
			}
		}
	};
	public void addNode(String data){//增加节点
		Node newNode = new Node(data);//定义一个新的节点
		if(this.root==null)//没有根节点
			this.root = newNode;//将第一个节点设置成根节点
		else//不是根节点,放到最后一个节点之后
			this.root.add(newNode);//通过Node自动安排此节点的位置
	}
	public void printNode(){//打印全部节点
		if(this.root!=null)//判断是否存在根节点
			this.root.showNode();
	}
	public boolean contains(String name){//判断节点是否存在
		return this.root.search(name);//调用Node类中的search方法
	}
	public void deleteNode(String data){//删除指定节点
		if(this.contains(data)){//如果节点存在,则执行删除操作
			if(this.root.data.equals(data)){//判断根节点是否满足要求
				this.root = this.root.next;//将根节点之后的节点设置成为根节点
			}else{
				this.root.next.delete(root, data);//删除节点
			}
		}
	}
	public static void main(String args[]){
		Link l = new Link();
		l.addNode("A");
		l.addNode("B");
		l.addNode("C");
		l.addNode("D");
		l.addNode("E");
		l.addNode("F");
		l.printNode();
		System.out.println();
		l.deleteNode("A");
		l.printNode();
		System.out.println();
		System.out.println(l.contains("A"));
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值