连续的加班,赶进度终于告一段落了。
下面开始今天的文章,让我们一起动手code,实现单向链表和对其的一些基本操作。(如果有不太了解链表的可以看这里。)
链表节点类
public class Node {
// 数据域
public String data;
// 指针域(指向下一个节点)
public Node next;
/**
* 构造方法
*/
public Node(String data) {
this.data = data;
}
}
复制代码
单向链表(带头节点)的基本代码
public class SingleLinkedList {
// 头节点
private Node herd = new Node("HerdNode");
public Node getHerd() {
return herd;
}
public void setHerd(Node herd) {
this.herd = herd;
}
}
复制代码
在链表尾部添加节点
public void addAfter(Node newNode) {
// 辅助节点
Node temp = herd;
while (true) {
// 找到链表的最后一个节点,结束循环
if (temp.next == null) {
break;
}
// 将辅助节点后移
temp = temp.next;
}
// 将新节点添加链表尾部
temp.next = newNode;
}
复制代码
在指定节点内容后插入数据
开始编码前,先看下图,有助于理解代码。
/**
* 在指定节点内容后插入数据
*
* @param nodeData 指定节点的内容(插入到哪个节点后)
* @param newNode 新节点
*/
public void insertAfterNode(String nodeData, Node newNode) {
// 参数校验
if (nodeData == null) {
throw new RuntimeException("入参有误!");
}
// 辅助节点
Node temp = herd;
// 定义标识(表示找到指定节点)
boolean flag = false;
while (true) {
// 到达链表尾部
if (temp == null) {
break;
}
// 找到指定的节点,结束循环。
if (nodeData.equals(temp.data)) {
flag = true;
break;
}
// 将辅助节点后移
temp = temp.next;
}
if (flag) {
// 新节点跟指定节点的下一个节点连接。
newNode.next = temp.next;
// 指定节点跟新节点连接
temp.next = newNode;
} else {
throw new RuntimeException("未找到指定节点无法插入新节点!");
}
}
复制代码
根据指定节点内容删除节点
开始编码前,先看下图,有助于理解代码。
/**
* 删除指定节点
*
* @param data 指定节点内容(被删除的节点内容)
*/
public void delete(String data) {
// 参数校验
if (data == null) {
throw new RuntimeException("入参有误!");
}
// 定义辅助节点
// 注:该节点需要指向待删除节点的前一个节点
Node temp = herd;
// 定义标识(表示找到指定节点)
boolean flag = false;
while (true){
// 到达链表尾
if(temp.next == null){
break;
}
// 找到指定节点了
if(data.equals(temp.next.data)){
flag = true;
break;
}
temp = temp.next;
}
if(flag){
// 删除指定节点
temp.next = temp.next.next;
}else {
throw new RuntimeException("未找到指定节点无法进行删除操作!");
}
}
复制代码
单链表操作中比较有难度的也就是插入节点和删除节点了,通过上面的代码和图片相信大家对单链表有一个自己的认识了,如果有问题大家可以告诉我。查询和修改方法就不再进行代码演示了。通过上面的代码,相信大家也可以自己写出来。
今天的分享就先到这里了,如果文章哪里有问题希望大家可以指出来。看都看完了,点个赞再走吧!