单向循环链表
引子查询修改MyList测试测试1,没有节点测试2,有节点,但没有对应的节点测试3,有节点,有对应的节点
删除(续)修改MyList测试测试1,没有节点测试2,有节点,但没有对应节点测试3,有一个节点,有对应节点测试4,有两个节点,对应节点为首节点测试4,有两个节点,对应节点不是首节点测试5,有三个节点,对应节点为首节点测试6,有三个节点,对应节点不是首节点
修改修改MyList测试测试1,没有节点测试2,有节点,没有对应节点测试3,有节点,有对应节点
源码
引子
承接我的上一篇博客传送门
查询
同样的,链表不适合查询以及修改操作,不过我们是练习,简单的实现以下
修改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();
if(currNode
== this.firstNode
&& this.size
== 1L
)
{
this.firstNode
= null;
this.size
--;
return "删除成功";
}
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());
}
结果
源码
传送门