引子
承接我的上一篇博客传送门
回顾
上篇博客,我写到了删除首尾节点的操作。链表适合增加和删除操作,不适合查询和修改操作,但是我们只是练习,所以简单的实现一下
查询
因为根据值,删除节点,首先要找到这个节点,所以先做查询。
修改MyList
public Node queryNode(int value) {
Node currNode = this.firstNode;
while(currNode.getValue() != value)
{
if(currNode.getNextNode() != null)
{
currNode = currNode.getNextNode();
}
else
{
currNode = null;
break;
}
}
return currNode;
}
测试
测试1:能找到节点
@Test
void testquery(){
MyList myList = new MyList();
Node node1 = new MyList().new Node(1);
Node node2 = new MyList().new Node(2);
myList.setFirstNode(node1);
myList.addNode(node2);
System.out.println("链表"+myList);
Node currNode = myList.queryNode(1);
System.out.println("找到的节点"+currNode);
System.out.println("找到节点的上一个节点"+currNode.getPreNode());
System.out.println("找到节点的下一个节点"+currNode.getNextNode());
}
结果:
测试2:找不到节点
@Test
void testquery1(){
MyList myList = new MyList();
Node node1 = new MyList().new Node(1);
Node node2 = new MyList().new Node(2);
myList.setFirstNode(node1);
myList.addNode(node2);
System.out.println("链表"+myList);
Node currNode = myList.queryNode(3);
System.out.println("找到的节点"+currNode);
try {
System.out.println("找到节点的上一个节点"+currNode.getPreNode());
System.out.println("找到节点的下一个节点"+currNode.getNextNode());
} catch (Exception e) {
e.printStackTrace();
}
}
结果
空指针,没找到
删除
修改MyList
public String deleteNodeByValue(int value)
{
Node currNode = this.queryNode(value);
if(currNode == null)
{
return "没有值为"+value+"的节点";
}
System.out.println(currNode);
//如果是第一个节点直接替换
if(this.firstNode == currNode) this.firstNode = currNode.getNextNode();
//否则
Node preNode = currNode.getPreNode();
Node nextNode = currNode.getNextNode();
//防止空指针
if(preNode != null) preNode.setNextNode(nextNode);
if(nextNode != null) nextNode.setPreNode(preNode);
this.size--;
return "删除成功";
}
测试
测试1:删除第一个节点
@Test
void testDeleteByValue(){
MyList myList = new MyList();
Node node1 = new MyList().new Node(1);
Node node2 = new MyList().new Node(2);
myList.setFirstNode(node1);
myList.addNode(node2);
System.out.println("链表"+myList);
System.out.println(myList.deleteNodeByValue(1));
System.out.println("链表"+myList);
}
结果
测试2:删除非第一个节点
@Test
void testDeleteByValue1(){
MyList myList = new MyList();
Node node1 = new MyList().new Node(1);
Node node2 = new MyList().new Node(2);
myList.setFirstNode(node1);
myList.addNode(node2);
System.out.println("链表"+myList);
System.out.println(myList.deleteNodeByValue(2));
System.out.println("链表"+myList);
}
结果
测试3:删除没有的节点
@Test
void testDeleteByValue2(){
MyList myList = new MyList();
Node node1 = new MyList().new Node(1);
Node node2 = new MyList().new Node(2);
myList.setFirstNode(node1);
myList.addNode(node2);
System.out.println("链表"+myList);
System.out.println(myList.deleteNodeByValue(3));
System.out.println("链表"+myList);
}
结果
修改
修改MyList
public String updateNodeByValue(int origin, int target)
{
Node currNode = this.queryNode(origin);
if(currNode == null)
{
return "没有值为"+origin+"的节点";
}
currNode.setValue(target);
return "修改成功";
}
测试
测试1:测试有的节点
@Test
void testUpdate(){
MyList myList = new MyList();
Node node1 = new MyList().new Node(1);
myList.setFirstNode(node1);
System.out.println("链表"+myList);
System.out.println(myList.updateNodeByValue(1, 2));
System.out.println("链表"+myList);
}
结果
测试2:测试没有的节点
@Test
void testUpdate1(){
MyList myList = new MyList();
Node node1 = new MyList().new Node(1);
myList.setFirstNode(node1);
System.out.println("链表"+myList);
System.out.println(myList.updateNodeByValue(2, 2));
System.out.println("链表"+myList);
}
结果
遍历
修改MyList
public String queryAllList() {
StringBuilder stringBuilder = new StringBuilder();
boolean flag = false;
stringBuilder.append("{");
Node currNode = this.firstNode;
while(currNode != null)
{
flag = true;
stringBuilder.append("->");
stringBuilder.append(currNode.getValue());
currNode = currNode.getNextNode();
}
stringBuilder.append("}");
if(flag)
{
stringBuilder.deleteCharAt(1);
stringBuilder.deleteCharAt(1);
}
return stringBuilder.toString();
}
测试
测试1:有一个节点
@Test
void queryAll1(){
MyList myList = new MyList();
Node node1 = new MyList().new Node(1);
myList.setFirstNode(node1);
System.out.println(myList.queryAllList());
}
结果
测试2:有多个节点
@Test
void queryAll(){
MyList myList = new MyList();
Node node1 = new MyList().new Node(1);
Node node2 = new MyList().new Node(2);
myList.setFirstNode(node1);
myList.addNode(node2);
System.out.println(myList.queryAllList());
}
结果
测试3:没有节点
@Test
void queryAll2(){
MyList myList = new MyList();
System.out.println(myList.queryAllList());
}
结果