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

来源:互联网 发布:女生身高多少最好知乎 编辑:程序博客网 时间:2024/06/15 01:58

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


0 0