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");}
}
}