标签:
要点:链表的一个结点中,除了要保存数据,还必须保存它下一个结点的地址。
链表类型:
(1)单链表:每个结点只包含一个引用(即地址),指向下一个结点
(2)双向链表:每个结点包含两个引用,指向它的上一个结点和下一个结点
(3)单循环链表:在单链表中,表尾结点的引用指向表头结点即为单循环链表
准备数据
1 class data { 2 String name ; 3 String key ; 4 int age ; 5 } 6 class CLType { 7 data nodeData = new data(); 8 CLType nextNode; 9 }
class data 为结点的类,class CLType是链表的类。
链表的基本操作
追加结点(在末尾增加一个结点)
步骤:
(1)申请内存空间,保存新增的结点
(2)从表头开始检查,找到最后一个结点
(3)把表尾的引用指向新的结点
(4)把新增的结点的引用设置为null
1 CLType CLAddEnd(CLType head,data nodeData) { 2 CLType node,htemp; 3 if((node = new CLType) == null) { 4 System.out.println("申请内存失败"); 5 return null; 6 } 7 else { 8 node.nodeData = nodeData; 9 node.nextNode = null; 10 if(head == null){ 11 head = node; 12 return head; 13 } 14 htemp = head; 15 while(htemp.nextNode != null){ 16 htemp = htemp.nextNode; 17 } 18 htemp.nextNode = node; 19 return head; 20 } 21 }
查找结点(通过关键字查找)
1 CLType CLFindNode(CLType head,Strind key){ 2 CLType htemp; 3 htemp = head; //从头开始找 4 while(htemp != null){ //若结点有效,则开始查找 5 if(htemp.nodeData.key.compareTo(key) == 0){ 6 return htemp; 7 } 8 htemp = htemp.nextNode; 9 } 10 return null; //没找到 11 }
插入结点
步骤:
(1)申请内存
(2)找到要插入的逻辑位置(位于哪两个结点之间)
(3)修改插入位置结点的引用
1 CLType CLInsertNode(CLType head,Srting findkey,data nodeData){ 2 CLType node,nodetemp; 3 if((node = new CLType()) == null){ // 申请内存 4 System.out.println("申请内存失败"); 5 return null; 6 } 7 node.nodeData = nodeData; //保存新增结点的数据 8 nodetemp = CLFindNode(head,findkey); 9 if(nodetemp == null){ 10 node.nextNode = nodetemp.nextNode; 11 nodetemp.nextNode = node; 12 } 13 else{ 14 System.out.println("未找到正确位置"); 15 } 16 return head; 17 }
删除结点
(1)找到要删除的结点
(2)使前一结点的引用指向要删除结点的下一个结点
(3)删除结点
1 int CLDeleteNode(CLType head,String key){ 2 CLType node ,htemp; 3 htemp = head; 4 node = head; 5 while(htemp != null){ 6 if(htemp.nodeData.key.compareTo(key) == 0){ 7 node.nextNode = htemp.nextNode; 8 htemp = null; //释放内存 9 return 1; 10 } 11 else { 12 node = htemp; 13 htemp = htemp.nextNode; 14 } 15 } 16 return 0; 17 }
标签:
原文地址:http://www.cnblogs.com/ljh-dm/p/4973366.html