给你一个链表的头节点 head
。
移除每个右侧有一个更大数值的节点。
返回修改后链表的头节点 head
。
示例:
输入:head = [5,2,13,3,8] 输出:[13,8] 解释:需要移除的节点是 5 ,2 和 3 。 - 节点 13 在节点 5 右侧。 - 节点 13 在节点 2 右侧。 - 节点 8 在节点 3 右侧。
解题思路:
先反转原链表和建立一个新的链表,从左到右遍历反转后的链表,记录最大值,如果遍历的节点的值大于或等于最大值,那么把该值添加到新链表的表头,同时更新最大值为当前值;如果遍历的节点的值小于最大值,那么直接遍历下一个节点,不用添加到新的链表中。最后返回新建的链表。
class Solution {
public ListNode removeNodes(ListNode head) {
if(head == null)
return null;
ListNode prev = null, cur = head;
int top = -1;
while(cur != null){
ListNode next = cur.next;
cur.next = prev;
prev = cur;
cur = next;
}
ListNode list = null;
int max = 0;
while(prev != null){
int x = prev.val;
if(x >= max){
max = x;
list = new ListNode(x, list);
}
prev = prev.next;
}
return list;
}
}