java编程基础之链表

          数组查询速度虽然快,但插入删除不方便,链表不是线性存储,便于插入删除。可以将链表比作一辆火车,链表的节点就是一节节车厢,节点中的数据就是车厢中的东西,节点间的联系就是车厢之间的联系。

          如何实现一个链表呢?“万丈高楼平地起”,做“火车”先得准备“车厢”-------节点类

节点中有两个属性:1.数据,2.对下一个节点的指向

package list;

public class LinkNode {
	Object data;
	public LinkNode next;
	public Object getData() {
		return data;
	}
	public void setData(Object data) {
		this.data = data;
	}
	public LinkNode getNext() {
		return next;
	}
	public void setNext(LinkNode next) {
		this.next = next;
	}
	
	
}

            “车厢”准备好了,可以组装火车了。首先考虑一个链表有哪些属性,毫不疑问,有以下几个:

1.根节点(root),2.链表长度(length);

链表的方法:增,删,改,查;

代码如下:

 

 

package list;
//T是泛型
public class LinkList<T> {
	private LinkNode root=null,tail=null;
	int length=0;
	//得到长度
	public int  size(){
		return length;
	}
	//添加
	public void add(T data){
		LinkNode node=new LinkNode();
		node.setData(data);
		node.setNext(null);
		length++;
		if(root==null){
			root=node;
			tail=root;
		}else{
		     tail.next=node;
		     tail=node;     
		}	
	}
	//查询
	public LinkNode getNode(int index){
		LinkNode node=new LinkNode();
		node=root;
		for(int i=0;i<index-1;i++){
			node=node.next;
		}
		return node;
	}
	//按数据删除
	public void delData(T data){
		int count=0;
		for(int i=0;i<this.length;i++){
			LinkNode node=this.getNode(i);
			if(node.data==data){
				if(node==root){
					root=root.next;	
				}else
				{
					LinkNode newnode=this.getNode(i-1);
					newnode.setNext(node.next);
				}
				length--;
				count++;
			}
		}
		if(count==0){
			System.out.println("not found !");
		}
	}
	//按索引删除
	public void delIndex(int index){
		if(index==1){
			root=root.next;
			length--;
		}
		else if(index>1&&index<=length){
			LinkNode node1=this.getNode(index);
			LinkNode node2=this.getNode(index-1);
			node2.setNext(node1.next);
			length--;
		}
		else{
			System.out.println("error");
		}
		
	}
	//插入
	public void insert(T data,int index){
		if(index>length||index<1){
			System.out.println("error");
		}
		else{
			LinkNode node=new LinkNode();
			node.setData(data);
			length++;
			if(index==1){
			    node.setNext(root);
				root=node;
			}
			else
			{
				LinkNode node1=this.getNode(index);
				LinkNode node2=this.getNode(index-1);
				node.setNext(node1);
				node2.setNext(node);
			}
		}
	}
	//遍历
	public void travel(LinkList list){
		for(int i=0;i<list.length;i++){
			LinkNode node=list.getNode(i+1);
			System.out.println(node.data);
		}
	}
	//更新
	public void update(int index ,T data){
		if(index>length||index<1){
			System.out.println("error");
		}
		else
		{
			LinkNode node=this.getNode(index);
			node.setData(data);
		}
	}
	public static void main(String []args){
		LinkList list=new LinkList();
		for(int i=0;i<10;i++){
			list.add(i+1);
		}
		list.travel(list);
		
		list.delData(6);
		list.travel(list);
		
		list.delIndex(10);
		list.travel(list);
		
		list.update(4, 100);
		list.travel(list);
	}
}

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值