📌  相关文章
📜  Java程序删除右侧具有更大价值的节点(1)

📅  最后修改于: 2023-12-03 15:02:05.893000             🧑  作者: Mango

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

在某些场景下,需要对链表中的节点进行删除操作。但是删除的节点需要满足某些条件,例如右侧节点的值比当前节点的值更大等。本文将介绍如何使用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)。如果你还有其他方法或者更好的建议,欢迎在评论区留言。