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

例二:链表中delete_ if

要求:

把所有数值为2的结点删除掉
【封神操作】循环控制_例题链表删除结点【学习笔记】_第1张图片
循环从什么角度入手?
定义【循环不变式】


假设第一个2已经被删掉了
在这里插入图片描述
怎么处理第2个2
【封神操作】循环控制_例题链表删除结点【学习笔记】_第2张图片
思路:
Java:把3的next指向5,垃圾回收把结点2回收掉
C++:还需要delete结点2


具体怎么做?

有一个变量指向结点3
【封神操作】循环控制_例题链表删除结点【学习笔记】_第3张图片
把3指向5
在这里插入图片描述
不用管2


删完2,下一个要考虑结点5,
此时previous指向3
【封神操作】循环控制_例题链表删除结点【学习笔记】_第4张图片
完成【循环不变式】向前推进的过程


【循环不变式】:

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


从previous结点的next进行考虑:

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


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

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


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


While循环体怎么写

【封神操作】循环控制_例题链表删除结点【学习笔记】_第6张图片
【封神操作】循环控制_例题链表删除结点【学习笔记】_第7张图片


封神操作!

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


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
	}

输出结果:

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


完整代码在这里哦!

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

你可能感兴趣的:(循环,学习笔记,链表,java)