import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param head ListNode类
     * @return ListNode类
     */
    public ListNode deleteNodes (ListNode head) {
        // write code here
          // 如果链表为空或者只有一个节点,直接返回原链表
        if (head == null || head.next == null) {
            return head;
        }

        // 创建一个虚拟头节点,方便处理头节点的特殊情况
        ListNode dummy = new ListNode(Integer.MAX_VALUE);
        dummy.next = head;
        ListNode pre = dummy; // 前一个节点
        ListNode cur = head; // 当前节点

        while (cur != null && cur.next != null) {
            // 如果当前节点的值比前一个节点和后一个节点的值都大,说明需要删除当前节点
            if (cur.val > pre.val && cur.val > cur.next.val) {
                pre.next = cur.next; // 删除当前节点,即将前一个节点的 next 指针指向下一个节点
            }

            pre = cur; // 更新前一个节点
            cur = cur.next; // 更新当前节点
        }

        return dummy.next; // 返回删除后的链表头节点
    }
}

考察的知识点:

  1. 单链表的遍历和基本操作。
  2. 使用虚拟头节点简化链表操作,避免处理头节点的特殊情况。
  3. 判断节点值进行链表节点删除的操作。
  1. 定义了一个 FarmManager 类,其中包含了一个名为 deleteNodes 的方法,用于删除链表中比前后节点值都大的牛的编号,保留首尾的牛的编号不删除。
  2. 在方法中,首先判断链表是否为空或者只有一个节点,若是,则直接返回原链表。
  3. 创建虚拟头节点 dummy,指向链表的头部,并初始化前一个节点 pre 为虚拟头节点,当前节点 cur 为头节点。
  4. 使用 while 循环遍历链表,判断当前节点的值是否比前一个节点和后一个节点的值都大,若是,则删除当前节点,即将前一个节点的 next 指针指向下一个节点。
  5. 更新前一个节点为当前节点,并将当前节点更新为下一个节点,继续检查下一个节点。
  6. 最后返回删除后的链表头部。