📜  Javascript程序删除右侧具有更大价值的节点

📅  最后修改于: 2022-05-13 01:57:45.124000             🧑  作者: Mango

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:

  1. 将下一个节点的数据复制到 X 中,即 X.data = X.next.data。
  2. 复制下一个节点的下一个地址,即 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

详情请参考右侧有更大价值的删除节点的完整文章!