如何打印链表的最后三个节点?

how to print the last three nodes of a linked list?

我尝试获取链表的最后三个节点的整个代码是: 节点 class:

package com.company;

public class Node {

    public int data;
    public Node nextNode;

    public Node(int data) {
        this.data = data;
        this.nextNode = null;
    }

    public int getData() {
        return data;
    }
}

链表class;

package com.company;
public class LinkedList {
    public Node head;
    public int size;

    public LinkedList() {
        this.head = null;
        this.size = 0;
    }

    public void add(int data) {
        Node node = new Node(data);
        if (head == null) {
            head = node;
        } else {
            Node currentNode = head;
            while(currentNode.nextNode != null) {
                currentNode = currentNode.nextNode;
            }
            currentNode.nextNode = node;
        }
        size++;
    }
    
    public void printData() {
        Node currentNode = head;

        while(currentNode != null) {
            int data = currentNode.getData();
            System.out.println(data);
            currentNode = currentNode.nextNode;
        }
    }

    public void printLastThree(){
        Node currentNode = head;
        int i = this.size - 3;
        while(i <= this.size) {
            int data = currentNode.getData();
            System.out.println(data);
            currentNode = currentNode.nextNode;
            i++;
        }
    }
}

主要class:

package com.company;
public class Main {
    public static void main(String[] args) {
        LinkedList ll = new LinkedList();

        ll.add(1);
        ll.add(2);
        ll.add(3);
        ll.add(4);
        ll.add(5);
        ll.add(6);
        ll.add(7);
        ll.add(8);
        ll.add(9);
        ll.add(10);
        ll.add(11);
        ll.add(12);
        
        ll.printData();
        System.out.println();
        ll.printLastThree();
    }
}

如您所见,在 linked list class 中,我尝试使用 printLastThree() 方法打印链表的最后三个节点,但在控制台中我只得到:

1
2
3
4

我想得到:

10
11
12

你能告诉我我做错了什么吗? 我尝试在printLastThree()方法中获取链表的总大小并减去3个位置,然后得到链表的总大小,但这不起作用。 谢谢。

错误在 printLastThree() 中。

您需要将currentNode从head移动到位置:size-3;但暂时不要打印它。

然后,再次从 size-3 移动到 size-1,并在移动过程中打印出来。

尝试 2 个 while 循环。后面也可以做成1个while循环从头到尾有if条件是否打印。

Once 从您的代码中可以看出 currentNode 作为 head 节点开始,并且它的值在循环的第一次迭代中打印出来。这不是你想要的。

您首先必须跳过 个节点,不会 打印这些节点。您已经计算出需要跳过多少这样的节点(this.size - 3),因此您只需要添加循环即可实际跳过那么多节点:

    public void printLastThree(){
        Node currentNode = head;
        // First SKIP nodes (not to be printed)
        for (int i = size - 3; i > 0; i--) {
            currentNode = currentNode.nextNode;
        }
        // ...and only then start printing
        while (currentNode != null) {
            int data = currentNode.getData();
            System.out.println(data);
            currentNode = currentNode.nextNode;
        }
    }

你也可以用一个循环来完成,并在当前索引上条件打印:

    public void printLastThree(){
        Node currentNode = head;
        for (int i = 0; i < size; i++) {
            if (i >= size - 3) { // Are we at the last three nodes?
                int data = currentNode.getData();
                System.out.println(data);
            }
            currentNode = currentNode.nextNode;
        }
    }