C++程序 删除右侧具有较大值的节点
给定一个单链表,删除所有右侧具有较大值的节点。
例如:
输入: 12->15->10->11->5->6->2->3->NULL
输出: 15->11->6->3->NULL
解释: 12、10、5和2已被删除,因为右侧存在较大值的节点。当我们检查12时,我们发现在12后面有一个值比12大的节点(即15),因此我们删除了12。 当我们检查15时,我们发现在15后面没有一个值比15大的节点,因此我们保留了这个节点。当我们这样继续时,我们得到15->6->3
输入: 10->20->30->40->50->60->NULL
输出: 60->NULL
解释: 10、20、30、40和50已被删除,因为它们的右侧都有更大的值。
输入: 60->50->40->30->20->10->NULL
输出: 无改变。
方法1(简单):
使用两个循环。在外部循环中,逐个选择链表节点。在内部循环中,检查是否存在具有大于选定节点值的节点。如果存在大于选定节点值的节点,则删除选定节点。
时间复杂度: O(n^2)
方法2(使用反转):
感谢Paras提供下面的算法。
1. 反转列表。
2. 遍历反转列表。保留当前的最大值。如果下一个节点小于最大值,则删除下一个节点,否则将最大值更新为下一个节点。
3. 反转列表以保留原始顺序。
时间复杂度: O(n)
输出:
时间复杂度 :O(n)
辅助空间 :O(1)