学习目标
更新于(2018-7-13 18:31:49)
自己实现一个单向链表,更好的理解单向链表的底层结构!
/**
* 链表类
*/
public class Link {
/**
* 保存每一个节点,为了方便直接定义成内部类
*/
public class Node {
private String data; // 节点的内容
private Node next; // 下一个节点
public Node(String data) { // 通过构造方法设置节点内容
this.data = data;
}
/**
* 增加节点
*/
public void add(Node node) {
if (this.next == null) { // 如果下一个节点为空,则把新节点加入到next的位置上
this.next = node;
} else { // 如果下一个节点不为空,则继续找下一个节点
this.next.add(node);
}
}
/**
* 输出节点
*/
public void print() {
/**
* 存在下一个节点
*/
if (this.next != null) {
System.out.print(this.data + "-->");
this.next.print();
} else {
System.out.print(this.data + "\n");
}
}
/**
* 内部搜索节点的方法
*/
public boolean search(String data) {
if (this.data.equals(data)) {
return true;
}
/**
* 直到不存在下一个节点结束搜索
*/
if (this.next != null) {
return this.next.search(data);
} else {
return false;
}
}
/**
* 内部移除节点的方法
*/
public void delete(Node previous, String data) {
if (this.data.equals(data)) {
previous.next = this.next; // 拼接节点
} else {
/**
* 假设末尾,直接移除
*/
if (this.next != null) {
this.next.delete(this, data);
}
}
}
}
private Node root; // 定义头节点
/**
* 添加节点
*/
public void addNode(String data) {
Node newNode = new Node(data); // 要插入的节点
/**
* 如果没有头节点,则要新增的节点为头节点
*/
if (this.root == null) { //
this.root = newNode;
} else { // 如果有头节点,则调用节点新增类的方法
this.root.add(newNode);
}
}
/**
* 展示列表的方法
*/
public void print() {
if (root != null) { // 当链表存在节点的时候进行展示
this.root.print();
}
}
/**
* 链表中寻找指定内容的节点
*/
public boolean searchNode(String data) {
return root.search(data); // 调用内部搜索节点的方法
}
/**
* 链表中删除指定内容的节点
*/
public void deleteNode(String data) {
if (root.data.equals(data)) { // 如果是头节点
if (root.next != null) {
root = root.next;
} else {
root = null;
}
} else {
root.next.delete(this.root, data); // 调用内部移除节点的方法
}
}
}
public class LinkDemo {
public static void main(String[] args) {
Link link = new Link();
link.addNode("A");
link.addNode("B");
link.addNode("C");
link.addNode("D");
System.out.println("原链表:");
link.print();
String searchNode = "B";
System.out.println("查找节点:" + searchNode);
String result = link.searchNode(searchNode) ? "找到!" : "没找到!";
System.out.println("查找结果:" + result);
System.out.println("删除节点:" + searchNode);
link.deleteNode(searchNode);
System.out.println("删除节点后的链表:");
link.print();
}
}