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

引子

承接我的上一篇博客传送门

查询

同样的,链表不适合查询以及修改操作,不过我们是练习,简单的实现以下

修改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());
	}

结果
在这里插入图片描述

源码

传送门

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值