1、数据类:节点中的数据部分
package list;
public class Data2 {
String key;
String name;
int age;
}
链表类
package list;
public class CLType {
Data2 nodeData = new Data2();
CLType nextNode;
CLType add(CLType head ,Data2 nodeData) { // 在链表末端添加节点,返回头节点,若头节点为空则添加的节点为头节点
CLType node,htemp;
if ((node = new CLType())==null) {
System.out.println("申请内存失败");
return null;
}else {
node.nodeData = nodeData;
node.nextNode = null;
if (head == null) {
head = node;
return head;
}
htemp = head;
while (htemp.nextNode != null) {
htemp = htemp.nextNode;
}
htemp.nextNode = node;
return head;
}
}
CLType addFirst(CLType head,Data2 nodeData) {
CLType node;
if ((node = new CLType())==null) {
System.out.println("申请内存失败");
return null;
}else {
node.nodeData = nodeData;
node.nextNode = head;
head = node;
return head;
}
}
CLType findNode(CLType head,String key) {
CLType htemp;
htemp = head;
while(htemp != null) {
if (htemp.nodeData.key.compareTo(key) == 0) {
return htemp;
}
htemp = htemp.nextNode;
}
return null;
}
CLType insert(CLType head,String findkey, Data2 nodeData) {
CLType node,nodeTemp;
if ((node = new CLType())==null) {
System.out.println("申请内存失败");
return null;
}
node.nodeData = nodeData;
nodeTemp = findNode(head, findkey);
if (nodeTemp != null) {
node.nextNode = nodeTemp.nextNode;
nodeTemp.nextNode = node;
}else {
System.out.println("未找到正确的插入位置");
}
return head;
}
int delete (CLType head,String key) {
CLType node,htemp;
htemp = head;
node = head;
while (htemp != null) { // 怎么解释
if (htemp.nodeData.key.compareTo(key) == 0) {
node.nextNode = htemp.nextNode;
return 1;
}else {
node = htemp;
htemp = htemp.nextNode;
}
}
return 0;
}
int getLength(CLType head) {
CLType htemp;
int len = 0;
htemp = head;
while (htemp != null) {
len ++;
htemp = htemp.nextNode;
}
return len;
}
void displayAll(CLType head) {
CLType htemp;
Data2 nodeData;
htemp = head;
System.out.printf("当前共有%d个节点,链表所有数据如下:\n",getLength(head));
while (htemp != null) {
nodeData = htemp.nodeData;
System.out.printf("节点(%s,%s,%d)\n",nodeData.key,nodeData.name,nodeData.age);
htemp = htemp.nextNode;
}
}
}
测试类:
package list;
import java.util.Scanner;
public class TestCL {
public static void main(String[] args) {
CLType node,head = null;
CLType CL = new CLType();
String key ,findkey;
Scanner input = new Scanner(System.in);
System.out.println("链表测试,先输入链表的数据,格式为:关键字 姓名 年龄\n");
do {
Data2 nodeData = new Data2();
nodeData.key = input.next();
if (nodeData.key.equals("0")) {
break;
} else {
nodeData.name = input.next();
nodeData.age = input.nextInt();
head = CL.add(head, nodeData);
}
} while (true);
CL.displayAll(head);
System.out.printf("\n演示插入节点,输入插入位置的关键字:");
findkey = input.next();
System.out.println("输入插入节点的数据(关键字 姓名 年龄):");
Data2 nodeData = new Data2();
nodeData.key = input.next();
nodeData.name = input.next();
nodeData.age = input.nextInt();
head = CL.insert(head, findkey, nodeData);
CL.displayAll(head);
System.out.println("\n演示删除节点,输入要删除的关键字:");
key = input.next();
CL.delete(head, key);
CL.displayAll(head);
System.out.println("\n演示在链表中查找,输入查找关键字:");
key = input.next();
node = CL.findNode(head, key);
if (node != null) {
nodeData = node.nodeData;
System.out.printf("关键字%s对应的节点为(%s,%d,%d)\n",key,nodeData,key,nodeData.name,nodeData.age);
} else {
System.out.printf("在链表中未找到关键字%s的节点\n",key);
}
}
}
结果:
链表测试,先输入链表的数据,格式为:关键字 姓名 年龄
001 a 21
002 b 22
003 c 23
0
当前共有3个节点,链表所有数据如下:
节点(001,a,21)
节点(002,b,22)
节点(003,c,23)
演示插入节点,输入插入位置的关键字:002
输入插入节点的数据(关键字 姓名 年龄):
004 d 24
当前共有4个节点,链表所有数据如下:
节点(001,a,21)
节点(002,b,22)
节点(004,d,24)
节点(003,c,23)
演示删除节点,输入要删除的关键字:
004
当前共有3个节点,链表所有数据如下:
节点(001,a,21)
节点(002,b,22)
节点(003,c,23)
演示在链表中查找,输入查找关键字:
003
关键字003对应的节点为(003,c,23)