Javascript程序删除右侧具有更大价值的节点
给定一个单链表,删除右边所有值较大的节点。
例子:
Input: 12->15->10->11->5->6->2->3->NULL
Output: 15->11->6->3->NULL
Explanation: 12, 10, 5 and 2 have been deleted because there is a
greater value on the right side. When we examine 12,
we see that after 12 there is one node with a value
greater than 12 (i.e. 15), so we delete 12. When we
examine 15, we find no node after 15 that has a value
greater than 15, so we keep this node. When we go like
this, we get 15->6->3
Input: 10->20->30->40->50->60->NULL
Output: 60->NULL
Explanation: 10, 20, 30, 40, and 50 have been deleted because
they all have a greater value on the right side.
Input: 60->50->40->30->20->10->NULL
Output: No Change.
方法1(简单):
使用两个循环。在外循环中,一个一个地挑选链表的节点。在内部循环中,检查是否存在值大于选取的节点的节点。如果存在值较大的节点,则删除选取的节点。
时间复杂度: O(n^2)
方法2(使用反向):
感谢 Paras 提供以下算法。
1. 颠倒列表。
2. 遍历反向列表。保持最大值到现在。如果下一个节点小于max,则删除下一个节点,否则max =下一个节点。
3. 再次反转列表以保留原始顺序。
时间复杂度: O(n)
感谢 R.Srinivasan 提供以下代码。
Javascript
Javascript
输出:
Given Linked List
12 15 10 11 5 6 2 3
Modified Linked List
15 11 6 3
时间复杂度: O(n)
辅助空间: O(1)
方法三:
另一种更简单的方法是从头开始遍历列表,当当前节点<下一个节点时删除节点。要删除当前节点,请遵循此方法。假设您必须删除当前节点 X:
- 将下一个节点的数据复制到 X 中,即 X.data = X.next.data。
- 复制下一个节点的下一个地址,即 X.next = X.next.next。
仅当当前节点大于下一个节点时,在列表中向前移动。
Javascript
输出:
Given Linked List
12 15 10 11 5 6 2 3
Modified Linked List
15 11 6 3
时间复杂度: O(n)
辅助空间: O(1)
资料来源:https://www.geeksforgeeks.org/forum/topic/amazon-interview-question-for-software-engineerdeveloper-about-linked-lists-6
详情请参考右侧有更大价值的删除节点的完整文章!