单向循环链表
引子
承接我的上一篇博客传送门
查询
同样的,链表不适合查询以及修改操作,不过我们是练习,简单的实现以下
修改MyList
public Node queryNodeByValue(int value)
{
if(this.size == 0L) return null;//如果没有节点直接返回
Node currNode = this.firstNode;
long flag = 0L;//判断链表是否已经完整遍历,防止死循环
while(currNode.getValue() != value)
{
flag++;
if(flag >= this.size) break;//已经遍历过一遍,跳出循环
currNode = currNode.getNextNode();
}
//判断是因为已经遍历过一遍而退出循环
//还是因为找到了对应节点退出循环
if(currNode.getValue() == value) return currNode;
else return null;
}
测试
测试1,没有节点
@Test
void testDeleteLastNode() {
MyList myList = new MyList();
System.out.println(myList.deleteLastNode());
}
结果
测试2,有节点,但没有对应的节点
@Test
void testQueryNodeByValue2() {
MyList myList = new MyList();
Node node1 = new MyList.Node(1);
myList.setFirstNode(node1);
Node currNode = myList.queryNodeByValue(2);
System.out.println(currNode);
}
结果
测试3,有节点,有对应的节点
@Test
void testQueryNodeByValue3() {
MyList myList = new MyList();
Node node1 = new MyList.Node(1);
myList.setFirstNode(node1);
Node currNode = myList.queryNodeByValue(1);
System.out.println(currNode);
System.out.println(currNode.getNextNode());
System.out.println(currNode.getPreNode());
}
结果
删除(续)
我的上一篇博客,已经写了删除第一个节点跟最后一个节点,既然写了按值查询节点,那理应加上按值删除
修改MyList
public String deleteNodeByValue(int value)
{
Node currNode = queryNodeByValue(value);
//没有对应节点,直接返回
if(currNode == null) return "没有值为"+value+"的节点,删除失败";
Node preNode = currNode.getPreNode();//被删除节点的上一个节点
Node nextNode = currNode.getNextNode();//被删除节点的下一个节点
//如果只有一个节点,firstNode直接置空,大小减一即可
if(currNode == this.firstNode && this.size == 1L)
{
this.firstNode = null;
this.size--;
return "删除成功";
}
//如果删除的是第一个节点,而且有两个以上节点
//首先应该更改firstNode指向
if(currNode == this.firstNode && this.size > 1L)
{
this.firstNode = nextNode;
}
preNode.setNextNode(nextNode);
nextNode.setPreNode(preNode);
this.size--;
return "删除成功";
}
测试
测试1,没有节点
@Test
void testDeleteNodeByValue() {
MyList myList = new MyList();
System.out.println("---删除前---");
System.out.println(myList);
System.out.println(myList.queryAll());
System.out.println(myList.deleteNodeByValue(1));
System.out.println("---删除后---");
System.out.println(myList);
System.out.println(myList.queryAll());
}
结果
测试2,有节点,但没有对应节点
@Test
void testDeleteNodeByValue1() {
MyList myList = new MyList();
Node node1 = new MyList.Node(1);
myList.setFirstNode(node1);
System.out.println("---删除前---");
System.out.println(myList);
System.out.println(myList.queryAll());
System.out.println(myList.deleteNodeByValue(2));
System.out.println("---删除后---");
System.out.println(myList);
System.out.println(myList.queryAll());
}
结果
测试3,有一个节点,有对应节点
@Test
void testDeleteNodeByValue2() {
MyList myList = new MyList();
Node node1 = new MyList.Node(1);
myList.setFirstNode(node1);
System.out.println("---删除前---");
System.out.println(myList);
System.out.println(myList.queryAll());
System.out.println(myList.deleteNodeByValue(1));
System.out.println("---删除后---");
System.out.println(myList);
System.out.println(myList.queryAll());
}
结果
测试4,有两个节点,对应节点为首节点
@Test
void testDeleteNodeByValue3() {
MyList myList = new MyList();
Node node1 = new MyList.Node(1);
Node node2 = new MyList.Node(2);
myList.setFirstNode(node1);
myList.addNode(node2);
System.out.println("---删除前---");
System.out.println(myList);
System.out.println(myList.queryAll());
System.out.println(myList.deleteNodeByValue(1));
System.out.println("---删除后---");
System.out.println("首节点的后继节点"+myList.getFirstNode().getNextNode());
System.out.println("首节点的前驱结点"+myList.getFirstNode().getPreNode());
System.out.println(myList);
System.out.println(myList.queryAll());
}
结果
测试4,有两个节点,对应节点不是首节点
@Test
void testDeleteNodeByValue4() {
MyList myList = new MyList();
Node node1 = new MyList.Node(1);
Node node2 = new MyList.Node(2);
myList.setFirstNode(node1);
myList.addNode(node2);
System.out.println("---删除前---");
System.out.println(myList);
System.out.println(myList.queryAll());
System.out.println(myList.deleteNodeByValue(2));
System.out.println("---删除后---");
System.out.println("首节点的后继节点"+myList.getFirstNode().getNextNode());
System.out.println("首节点的前驱结点"+myList.getFirstNode().getPreNode());
System.out.println(myList);
System.out.println(myList.queryAll());
}
结果
测试5,有三个节点,对应节点为首节点
@Test
void testDeleteNodeByValue5() {
MyList myList = new MyList();
Node node1 = new MyList.Node(1);
Node node2 = new MyList.Node(2);
Node node3 = new MyList.Node(3);
myList.setFirstNode(node1);
myList.addNode(node2);
myList.addNode(node3);
System.out.println("---删除前---");
System.out.println(myList);
System.out.println(myList.queryAll());
System.out.println(myList.deleteNodeByValue(1));
System.out.println("---删除后---");
System.out.println("首节点的后继节点"+myList.getFirstNode().getNextNode());
System.out.println("首节点的前驱结点"+myList.getFirstNode().getPreNode());
System.out.println(myList);
System.out.println(myList.queryAll());
}
结果
测试6,有三个节点,对应节点不是首节点
@Test
void testDeleteNodeByValue6() {
MyList myList = new MyList();
Node node1 = new MyList.Node(1);
Node node2 = new MyList.Node(2);
Node node3 = new MyList.Node(3);
myList.setFirstNode(node1);
myList.addNode(node2);
myList.addNode(node3);
System.out.println("---删除前---");
System.out.println(myList);
System.out.println(myList.queryAll());
System.out.println(myList.deleteNodeByValue(2));
System.out.println("---删除后---");
System.out.println("首节点的后继节点"+myList.getFirstNode().getNextNode());
System.out.println("首节点的前驱结点"+myList.getFirstNode().getPreNode());
System.out.println(myList);
System.out.println(myList.queryAll());
}
结果
修改
修改MyList
public String updateNodeByValue(int origin, int target)
{
Node currNode = queryNodeByValue(origin);
if(currNode == null) return "没有值为"+origin+"的节点,修改失败";
else currNode.setValue(target);
return "修改成功";
}
测试
测试1,没有节点
@Test
void testUpdateNodeByValue() {
MyList myList = new MyList();
System.out.println(myList.updateNodeByValue(1, 2));
}
结果
测试2,有节点,没有对应节点
@Test
void testUpdateNodeByValue1() {
MyList myList = new MyList();
Node node1 = new MyList.Node(1);
myList.addNode(node1);
System.out.println(myList.updateNodeByValue(2, 3));
}
结果
测试3,有节点,有对应节点
@Test
void testUpdateNodeByValue2() {
MyList myList = new MyList();
Node node1 = new MyList.Node(1);
myList.addNode(node1);
System.out.println("---修改前---");
System.out.println(myList);
System.out.println(myList.queryAll());
System.out.println(myList.updateNodeByValue(1, 3));
System.out.println("---修改后---");
System.out.println(myList);
System.out.println(myList.queryAll());
}
结果