📌  相关文章
📜  Java程序查找给定链表的最后N个节点的总和(1)

📅  最后修改于: 2023-12-03 14:43:03.988000             🧑  作者: Mango

使用Java程序查找给定链表的最后N个节点的总和

当你需要查找链表的最后N个节点的总和时,你可以使用Java编写一个简单的程序来实现这个目标。下面我们就来详细介绍这个方法。

创建链表

首先,我们需要创建一个链表数据结构。链表结构中包含节点数值和指向下一个节点的指针。我们可以定义一个节点类来表示一个节点的结构。

public class ListNode {
    int val;
    ListNode next;
    ListNode(int x) { val = x; }
}

然后,在创建链表时,我们需要定义一个头节点来作为链表的起点。我们可以定义一个LinkedList类来表示完整的链表结构。

public class LinkedList {
    ListNode head;
    public void addNode(int val) {
        ListNode newNode = new ListNode(val);
        if (head == null) {
            head = newNode;
        } else {
            ListNode current = head;
            while (current.next != null) {
                current = current.next;
            }
            current.next = newNode;
        }
    }
}

在addNode方法中,我们检查链表是否已经存在,如果没有,则将新节点添加到链表的头部,否则迭代整个链表,找到链表的最后一个节点并将新节点添加到其后。

查找最后N个节点的总和

接下来,我们需要编写一个方法来查找链表的最后N个节点的总和。我们可以先遍历整个链表,找到链表的长度。然后,假设链表长度为len,则最后N个节点的开始位置为len - N + 1。最后,遍历链表中从开始位置到结尾的节点数值之和即可。

public int sumLastN(int n) {
    int len = 0;
    ListNode current = head;
    while (current != null) {
        len++;
        current = current.next;
    }
    if (n > len) {
        throw new IllegalArgumentException("n is larger than linked list length");
    }
    int start = len - n + 1;
    int sum = 0;
    current = head;
    while (start > 1) {
        current = current.next;
        start--;
    }
    while (current != null) {
        sum += current.val;
        current = current.next;
    }
    return sum;
}

在方法中,我们首先计算链表的长度。如果N大于链表长度,我们将抛出一个异常。然后,我们计算链表中最后N个节点的开始索引。最后,我们遍历从开始索引到链表结尾的节点,并将节点值相加。

完整代码

最后,这是我们的完整代码:

public class LinkedList {
    ListNode head;

    public void addNode(int val) {
        ListNode newNode = new ListNode(val);
        if (head == null) {
            head = newNode;
        } else {
            ListNode current = head;
            while (current.next != null) {
                current = current.next;
            }
            current.next = newNode;
        }
    }

    public int sumLastN(int n) {
        int len = 0;
        ListNode current = head;
        while (current != null) {
            len++;
            current = current.next;
        }
        if (n > len) {
            throw new IllegalArgumentException("n is larger than linked list length");
        }
        int start = len - n + 1;
        int sum = 0;
        current = head;
        while (start > 1) {
            current = current.next;
            start--;
        }
        while (current != null) {
            sum += current.val;
            current = current.next;
        }
        return sum;
    }

    public static void main(String[] args) {
        LinkedList list = new LinkedList();
        list.addNode(1);
        list.addNode(2);
        list.addNode(3);

        System.out.println(list.sumLastN(2));  // 输出5
    }
}

class ListNode {
    int val;
    ListNode next;

    ListNode(int x) {
        val = x;
    }
}

以上就是使用Java程序查找给定链表的最后N个节点的总和的方法。