2021.05.03
package per.zhangyh.algorithm.data_structure.code;
/**
*@author:zhangyonghui;
*@date: 2021/5/3; 9:30
*@Describe:一个单链表的节点
*/
public class SingleListNode {
private int data; //链表的数据;
private SingleListNode nextNode; //模拟链表中的指针,指向下一个节点;
/*写一个构造方法,以便于规定构造对象的时候就必须将节点数据赋进去:*/
public SingleListNode(int data) {
this.data = data;
}
/**
* 描述:追加节点
*/
public void appendNode(SingleListNode tempNode) {
//如果当前节点有下一个节点,则一直找下一个节点;直至没有下一个节点了,然后进行追加;
SingleListNode currentNode = this;
while (true) {
SingleListNode nextNode = currentNode.getNextNode();
//当前节点没有下一个节点了,作为递归出口,然后进行追加节点;
if (nextNode == null) {
break;
}
//当前节点有下一个节点,则继续找下去:
currentNode = nextNode;
}
//进行追加节点:
currentNode.setNextNode(tempNode);
}
/**
* 删除下一个节点;
* 描述:由于这是一个单链表,即只能找到下一个节点、找不到上一个节点,所以这里只能够删除下一个节点,无法进行删除当前节点;
* 思路: 先找出当前节点的下下一个节点,然后将当前节点的下一个节点改为指向下下一个节点,即可。
*/
public void removeNextNode() {
SingleListNode currentNode = this;
//找出下下一个节点:
if (currentNode.getNextNode() == null) { //如果当前节点已经是最后一个节点了;
System.out.println("当前节点已经是最后一个节点,所以无法删除该节点的下一个节点!");
} else {
SingleListNode nextNextNode = currentNode.getNextNode().getNextNode();
//将当前节点的下一个节点改为指向下下一个节点
currentNode.setNextNode(nextNextNode);
}
}
/**
* 插入一个节点;
* 思路:将现有节点的下一个节点变为下下一个节点;将新节点变为现在节点的下一个节点;
*/
public void insertNode(SingleListNode newNode) {
//当前节点的下一个节点:
SingleListNode nextNode=this.getNextNode();
//将新节点变为现在节点的下一个节点:
this.setNextNode(newNode);
//将原来的下一个节点变更为新节点的下一个节点:
newNode.setNextNode(nextNode);
}
/**
* 描述:附加方法,显示当前的链表;
*/
public void showList() {
SingleListNode currentNode = this;
while (true) {
System.out.print(currentNode.getData()+" ");
SingleListNode nextNode = currentNode.getNextNode(); //下一个节点
if (nextNode == null) {
break;
}else{
currentNode = nextNode;
}
}
}
//get、set方法;
public int getData() {
return data;
}
public void setData(int data) {
this.data = data;
}
public SingleListNode getNextNode() {
return nextNode;
}
public void setNextNode(SingleListNode nextNode) {
this.nextNode = nextNode;
}
}
package per.zhangyh.algorithm.data_structure.Test;
import per.zhangyh.algorithm.data_structure.code.SingleListNode;
/**
*@author:zhangyonghui;
*@date: 2021/5/3; 10:00
*@Describe:单链表测试
*/
public class SingleListNodeTest {
public static void main(String[] args) {
//新建几个单链表节点,(同时并进行赋值):
SingleListNode node1 = new SingleListNode(1);
SingleListNode node2 = new SingleListNode(2);
SingleListNode node3 = new SingleListNode(3);
SingleListNode node4 = new SingleListNode(4);
//追加节点:
node1.appendNode(node2);
node1.appendNode(node3);
node1.appendNode(node4);
//正确的追加应该是:1-2-3-4
int data2 = node1.getNextNode().getData();
System.out.println("正确的数值应该是2 = " + data2);
int data3 = node1.getNextNode().getNextNode().getData();
System.out.println("正确的数值应该是3 = " + data3);
int data4 = node1.getNextNode().getNextNode().getNextNode().getData();
System.out.println("正确的数值应该是4 = " + data4);
//显示当前链表:
System.out.println("当前链表:");
node1.showList();
//删除下一个节点:
node2.removeNextNode();
System.out.println("\r\n删除节点2的下一个节点之后的新链表:");
node1.showList();
//插入一个节点:
System.out.print("\r\n插入一个节点之前的当前链表:");
node1.showList();
SingleListNode newNode = new SingleListNode(3); //新结点
//插入:
node2.insertNode(newNode);
System.out.print("\r\n插入一个节点之后的当前链表:");
node1.showList();
}
}