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

京公网安备 11010502036488号