【封神操作】循环控制_例题链表删除结点【学习笔记】

例二:链表中delete_ if

要求:

把所有数值为2的结点删除掉
在这里插入图片描述
循环从什么角度入手?
定义【循环不变式】


假设第一个2已经被删掉了
在这里插入图片描述
怎么处理第2个2
在这里插入图片描述
思路:
Java:把3的next指向5,垃圾回收把结点2回收掉
C++:还需要delete结点2


具体怎么做?

有一个变量指向结点3
在这里插入图片描述
把3指向5
在这里插入图片描述
不用管2


删完2,下一个要考虑结点5,
此时previous指向3
在这里插入图片描述
完成【循环不变式】向前推进的过程


【循环不变式】:

从链表开头到previous结点为止,保证所有值为2的结点都已经被正确删除。


从previous结点的next进行考虑:

如果previous结点的next结点是2,把它删除;
如果previous结点的next结点不是2,把previous向后移一个。


如果第一个节点就是2,没有previous,有2种处理方法:

在这里插入图片描述


【一般情况】
Loop invariant: list nodes from head up to prev has been processed.
循环不变式:从head开始一直到prev已经被完全处理掉
Processed——>(Nodes with values equal to value deleted)


While循环体怎么写

在这里插入图片描述
在这里插入图片描述


封神操作!

在这里插入图片描述


public static void main(String[] args)
	{
		LinkedListCreator creator = new LinkedListCreator();
		LinkedListDeletor deletor = new LinkedListDeletor();

		Node.printLinkedList(deletor.deleteIfEquals(creator.creatLinkedList(Arrays.asList(1, 2, 3, 2, 5)), 2));

		Node.printLinkedList(deletor.deleteIfEquals(creator.creatLinkedList(Arrays.asList(1, 2, 3, 2, 2)), 2));

		// 删除头结点
		Node.printLinkedList(deletor.deleteIfEquals(creator.creatLinkedList(Arrays.asList(1, 2, 3, 2, 2)), 1));

		Node.printLinkedList(deletor.deleteIfEquals(creator.creatLinkedList(Arrays.asList(2, 2, 3, 2, 2)), 2));

		Node.printLinkedList(deletor.deleteIfEquals(creator.creatLinkedList(Arrays.asList(2, 2, 2, 2, 2)), 2));

		// 单点
		Node.printLinkedList(deletor.deleteIfEquals(creator.creatLinkedList(Arrays.asList(2)), 2));
		Node.printLinkedList(deletor.deleteIfEquals(creator.creatLinkedList(Arrays.asList(2)), 1));

		// 空集
		Node.printLinkedList(deletor.deleteIfEquals(creator.creatLinkedList(new ArrayList<Integer>()), 1));

		// 打印linked list,见Node.java
	}

输出结果:

在这里插入图片描述


完整代码在这里哦!

CheeseCheese-IScream
给个小星星鼓励一下吧~❤谢谢❤

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值