链表的全部操作——创建、插入、查找、删除、计算长度

1、链表结果应包含两个部分: 数据部分(该节点的数据) + 地址部分(下一个节点的地址)

2、一般定义一个head头引用变量,方便操作。

3、基本操作:

->追加节点:在链表尾部add一个新的节点,

->头插节点:在链表头部add一个新的节点。

->查找节点:一般是通过节点的data或者是key来一一对比查找。

->插入节点:在中间的指定位置add一个新的节点。

->删除节点:删除指定位置的节点。

->计算链表长度:链表在物理上的不连续,导致链表长度需要遍历所有节点后才能得到。

->打印所有节点:方便查看各项操作的结果,故将打印操作单独列为一个方法。




import java.util.Scanner;

/** 
*  @author   LilyLee
 * @date     2017年4月24日
 * @time     下午10:28:57
 * @Version  1.0
 * @email    lilylee_1213@foxmail.com
 *
 */
class DATA1{ //数据部分
	String key;
	String name;
	int age;
}

class CLType{  //定义链表的所有操作

	DATA1 nodeData=new DATA1();
	CLType nextNode;  //保存next的地址,很重要

	//public CLType(){};
	
	CLType CLAddEnd(CLType head,DATA1 nodeData){  //在链表的末尾追加节点
		CLType node,temp;
		if((node=new CLType())==null){return null;} //申请内存失败,返回。
		else{
			node.nodeData=nodeData;
			node.nextNode=null;
			if(head==null){
				head=node;
				return node;
			}
			temp=head;
			while(temp.nextNode!=null){//循环链表,查找到链表的尾部
				temp=temp.nextNode;
			}
			temp.nextNode=node;
			return head;
		}
	}

	
	CLType CLAddFirst(CLType head,DATA1 nodeData){//头插数据
		CLType node;
		if((node=new CLType())==null){return null;} //申请内存失败,返回。
		else{
			node.nodeData=nodeData;
			node.nextNode=head;
			head=node;
			return head;
		}
	}

	
	CLType CLFindNode(CLType head,String key){ //这里通过关键字key来查找节点
		CLType temp;
		temp=head;
		while(temp!=null){ //从头开始遍历链表
			if(temp.nodeData.key.equals(key)){return temp;}
			temp=temp.nextNode; //if 不满足的时候,继续找下一个节点
		}
		return null;
	}
	
	CLType CLInsertNode(CLType head,String findkey,DATA1 nodeData){//insert 插入节点
		CLType node, temp;
		if((node=new CLType())==null){return null;} //申请内存失败,返回。
		node.nodeData=nodeData;
		temp=CLFindNode(head,findkey);   //找到需要插入的位置
		if(temp!=null){
			node.nextNode=temp.nextNode;
			temp.nextNode=node;
		}
		else{
			System.out.println("no found!");
		}
		return head;
	}
	
	int CLDeleteNode(CLType head,String key){  //删除指定位置的节点
		CLType node,temp;
		temp=head;
		node=head;
		while(temp!=null){
			if(temp.nodeData.key.equals(key)){  //找到删除位置
				node.nextNode=temp.nextNode;
				return 1;
			}else{
				node=temp;
				temp=temp.nextNode;
			}
		}
		return 0;
	}
	
	int CLLength(CLType head){  //计算链表的长度
		CLType temp;
		int Len=0;
		temp=head;
		while(temp!=null){
			Len++;
			temp=temp.nextNode;
		}
		return Len;
	}
	
	void CLAllNode(CLType head){  //遍历链表
		CLType temp;
		temp=head;
		while(temp!=null){
			System.out.println(temp.nodeData.key+"  "+temp.nodeData.name+" "+temp.nodeData.age);
			temp=temp.nextNode;
		}
	}
	
	
}

public class LinkedList {

	public static void main(String[] args) {
		CLType node,head=null;
		CLType c=new CLType();
		String findkey,key="1";
		Scanner sc=new Scanner(System.in);
		System.out.println("input   key  name  age,endwith  0  ");
		while(true){
			DATA1 nodeData=new DATA1();
			nodeData.key=sc.next();
			if(nodeData.key.equals("0")){break;}
			nodeData.name=sc.next();
			nodeData.age=sc.nextInt();	
			head=c.CLAddEnd(head, nodeData);//在尾部添加节点
			
		}
		c.CLAllNode(head);//打印所有节点
		
		System.out.println("input Insert key");
		findkey=sc.next();
		System.out.println("input node data (key  name  age)");
		DATA1 nodeData=new DATA1();
		nodeData.key=sc.next();
		nodeData.name=sc.next();
		nodeData.age=sc.nextInt();
		head=c.CLInsertNode(head, findkey, nodeData);
		c.CLAllNode(head);
		
		System.out.println("input delete key");
		key=sc.next();
		c.CLDeleteNode(head, key);
		c.CLAllNode(head);
		
		System.out.println("input find key");
		key=sc.next();
		node=c.CLFindNode(head, key);
		if(node!=null){
			nodeData=node.nodeData;
			System.out.println(nodeData.key+nodeData.name+nodeData.age);
		}else{System.out.println("no found");}
	}
	

	

}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值