📅  最后修改于: 2023-12-03 15:02:05.893000             🧑  作者: Mango
在某些场景下,需要对链表中的节点进行删除操作。但是删除的节点需要满足某些条件,例如右侧节点的值比当前节点的值更大等。本文将介绍如何使用Java程序删除链表中右侧具有更大价值的节点。
首先需要定义链表节点的结构,包括节点值和指向下一个节点的指针。
class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
next = null;
}
}
定义好链表节点结构之后,可以编写删除节点的函数。函数的输入参数是链表的头节点,返回删除操作完成后的链表头节点。函数首先需要处理特殊情况,即链表为空或者只有一个节点的情况。
public ListNode deleteNodes(ListNode head) {
if (head == null || head.next == null) {
return head;
}
}
如果链表不为空并且包含多个节点,那么需要使用两个指针来遍历链表。其中一个指针prev
(previous node)用于保存上一个遍历到的节点,另一个指针curr
(current node)用于遍历当前节点。
public ListNode deleteNodes(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode prev = head;
ListNode curr = head.next;
while (curr != null) {
if (curr.val > prev.val) {
prev.next = curr.next;
curr = curr.next;
} else {
prev = prev.next;
curr = curr.next;
}
}
return head;
}
在遍历的过程中,如果当前节点的值比上一个节点的值更大,那么需要将当前节点从链表中删除。具体操作是将前一个节点的next
指针指向当前节点的下一个节点即可。
class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
next = null;
}
}
public class Main {
public static void main(String[] args) {
ListNode head = new ListNode(1);
head.next = new ListNode(2);
head.next.next = new ListNode(3);
head.next.next.next = new ListNode(2);
head.next.next.next.next = new ListNode(1);
ListNode newHead = deleteNodes(head);
printList(newHead);
}
public static ListNode deleteNodes(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode prev = head;
ListNode curr = head.next;
while (curr != null) {
if (curr.val > prev.val) {
prev.next = curr.next;
curr = curr.next;
} else {
prev = prev.next;
curr = curr.next;
}
}
return head;
}
public static void printList(ListNode head) {
ListNode curr = head;
while (curr != null) {
System.out.print(curr.val + " ");
curr = curr.next;
}
System.out.println();
}
}
以上是Java程序删除链表中右侧具有更大价值的节点的方法。该方法可以处理任意长度的链表,并且时间复杂度为O(n)。如果你还有其他方法或者更好的建议,欢迎在评论区留言。