例二:链表中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
给个小星星鼓励一下吧~❤谢谢❤