数据结构:单向循环链表(2)

    技术2025-08-13  16

    单向循环链表

    引子查询修改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();//被删除节点的下一个节点 //如果只有一个节点,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()); }

    结果

    源码

    传送门

    Processed: 0.012, SQL: 10