部分借鉴了小破站,尚有缺陷。
public class Node {
public int id;
public String name;
public Node next; //用于指向下一个节点
public Node(int id, String name) {
super();
this.id = id;
this.name = name;
}
@Override
public String toString() {
return id + "\t" + name;
}
}
public class LinkListDemo {
private Node head = new Node(0, "");
//获取头节点
public Node getHead() {
return head;
}
//添加节点
public void addNode(Node node) {
//head节点无法移动,须添加一个辅助节点用于遍历
Node temp = head;
//从链表最后添加数据
while (true) {
if (temp.next == null) {
break;
}
temp = temp.next;
}
temp.next = node;
}
//顺序添加
public void addOrderList(Node node) {
Node temp = head;
boolean flag = false;
while (true) {
if (temp.next == null) {
flag = true;
break;
} else if (temp.next.id > node.id) {
flag = true;
break;
} else if (temp.next.id == node.id) {
break;
}
temp = temp.next;
}
if (flag) {
node.next = temp.next;
temp.next = node;
} else {
System.out.println("id" + node.id + "重复");
}
}
//显示链表
public void showLinkList(Node head) {
//判断链表是否为空
if (head.next == null) {
System.out.println("链表为空。");
return;
}
//head节点无法移动,须添加一个辅助节点用于遍历
Node temp = head.next;
while (true) {
if (temp == null) {
break;
}
System.out.println(temp);
temp = temp.next;
}
}
//修改节点
public void updateLinkList(Node node) {
//判断链表是否为空
if (head.next == null) {
System.out.println("链表为空。");
return;
}
//定义一个辅助节点
Node temp = head.next;
//判断是否找到节点
boolean flag = false;
while (true) {
if (temp.next == null) {
break;
}
if (temp.id == node.id) {
flag = true;
break;
}
//后移
temp = temp.next;
}
if (flag) {
temp.name = node.name;
} else {
System.out.println("id为" + node.id + "的节点不存在。");
}
}
//删除节点
public void deleteLinkList(int id) {
Node temp = head;
boolean flag = false;
//找到待删除节点的前一个结点
while (true) {
//已经遍历到最后,需要退出循环
if (temp.next == null) {
break;
}
if (temp.next.id == id) {
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
temp.next = temp.next.next;
} else {
System.out.println("id为" + id + "的节点不存在。");
}
}
//查找节点
public void findLinkList(int id) {
Node temp = head;
boolean flag = false;
//找到待查找节点的前一个结点
while (true) {
//已经遍历到最后,需要退出循环
if (temp.next == null) {
break;
}
if (temp.next.id == id) {
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
System.out.println(temp.next.name);
} else {
System.out.println("id为" + id + "的节点不存在。");
}
}
//获取节点ID
public int getIDLinkList(String name) {
Node temp = head;
boolean flag = false;
//找到待查找节点的前一个结点
while (true) {
//已经遍历到最后,需要退出循环
if (temp.next == null) {
break;
}
if (temp.next.name == name) {
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
return temp.next.id;
} else {
System.out.println("此节点不存在。");
}
return 0;
}
//统计单链表中给定值等于e的结点个数
public int similarLinkList(String name) {
Node temp = head;
int num = 0;
while (true) {
//已经遍历到最后,需要退出循环
if (temp.next == null) {
break;
}
if (temp.next.name == name) {
num++;
}
temp = temp.next;
}
return num;
}
}
public class LinkListTest {
public static void main(String[] args) {
LinkListDemo linkListDemo = new LinkListDemo();
//创建节点 测试
Node node1 = new Node(1,"Poke");
Node node2 = new Node(2,"Hao");
Node node3 = new Node(4,"Jie");
Node node4 = new Node(3,"Tao");
Node node5 = new Node(5,"2019");
Node node6 = new Node(6,"Tao");
//添加节点 测试
linkListDemo.addNode(node1);
linkListDemo.addNode(node2);
linkListDemo.addNode(node3);
linkListDemo.addNode(node4);
linkListDemo.addNode(node5);
linkListDemo.addNode(node6);
//显示节点 测试
linkListDemo.showLinkList(linkListDemo.getHead());
System.out.println();
//修改节点 测试
linkListDemo.updateLinkList(new Node(2,"Van"));
linkListDemo.showLinkList(linkListDemo.getHead());
System.out.println();
//删除节点 测试
linkListDemo.deleteLinkList(5);
linkListDemo.showLinkList(linkListDemo.getHead());
System.out.println();
//查找节点 测试
linkListDemo.findLinkList(1);
System.out.println();
//获取节点ID 测试
System.out.println(linkListDemo.getIDLinkList("Van"));
System.out.println();
//统计单链表中给定值等于e的结点个数 测试
System.out.println(linkListDemo.similarLinkList("Tao"));
//linkListDemo.similarLinkList("Tao");
System.out.println();
/*
//创建顺序节点 测试
Node node1 = new Node(5, "Poke");
Node node2 = new Node(4, "Hao");
Node node3 = new Node(3, "Tao");
Node node4 = new Node(1, "Jie");
Node node5 = new Node(2, "2019");
linkListDemo.addOrderList(node1);
linkListDemo.addOrderList(node2);
linkListDemo.addOrderList(node3);
linkListDemo.addOrderList(node4);
linkListDemo.addOrderList(node5);
linkListDemo.showLinkList(linkListDemo.getHead());
System.out.println();
*/
}
}
练习
1、编程实现链表的基本操作。
2、统计单链表中给定值等于e的结点个数。
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
LinkListDemo linkListDemo = new LinkListDemo();
Scanner s = new Scanner(System.in);
/*
System.out.print("请输入链表长度:");
int a = s.nextInt();
System.out.println("请依次输入链表元素:");
for (int i = 0; i < a; i++) {
String b = s.next();
linkListDemo.addNode(new Node(i + 1, b));
}
*/
Node node1 = new Node(1,"Poke");
Node node2 = new Node(2,"Hao");
Node node3 = new Node(4,"Jie");
Node node4 = new Node(3,"Tao");
Node node5 = new Node(5,"2019");
Node node6 = new Node(6,"Tao");
linkListDemo.addNode(node1);
linkListDemo.addNode(node2);
linkListDemo.addNode(node3);
linkListDemo.addNode(node4);
linkListDemo.addNode(node5);
linkListDemo.addNode(node6);
System.out.println("显示链表:");
linkListDemo.showLinkList(linkListDemo.getHead());
System.out.println();
System.out.print("请输入要删除的链表元素ID:");
//String c = s.next();
//linkListDemo.deleteLinkList(linkListDemo.getIDLinkList(c));
int c= s.nextInt();
linkListDemo.deleteLinkList(c);
linkListDemo.showLinkList(linkListDemo.getHead());
System.out.println();
System.out.println("请输入要修改的ID及链表元素:");
int d = s.nextInt();
String e = s.next();
linkListDemo.updateLinkList(new Node(d,e));
linkListDemo.showLinkList(linkListDemo.getHead());
System.out.println();
System.out.print("请输入要查找链表元素的ID:");
int f = s.nextInt();
System.out.print("该链表元素值为:");
linkListDemo.findLinkList(f);
System.out.println();
//System.out.print("请输入要统计结点个数的单链表中给定值:");
//String g = s.next();
System.out.print("Tao个数为:" + linkListDemo.similarLinkList("Tao"));
//linkListDemo.similarLinkList(g);
System.out.println();
}
}