数据结构:实现单向链表(2)

引子

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

回顾

上篇博客,我写到了删除首尾节点的操作。链表适合增加和删除操作,不适合查询和修改操作,但是我们只是练习,所以简单的实现一下

查询

因为根据值,删除节点,首先要找到这个节点,所以先做查询。

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

结果
在这里插入图片描述

源码

传送门

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值