java - 在单链表中查找倒数第二个节点

标签 java list singly-linked-list

所以我有一个单链表的实现,我试图添加一个方法来报告列表的倒数第二个节点。但是,我不确定是否允许我在 Node 类下编写方法然后从单链表类访问它。如果我这样做,我的节点类的实例变量('head'用作访问倒数第二个方法的变量,但也用作倒数第二个方法的输入。可以吗?下面是我的实现/尝试。

public class SinglyLinkedList { 

    private static class Node<Integer>{
        private Integer element;
        private Node<Integer> next;
        private Node<Integer> penultimate;

        public Node(Integer e, Node<Integer> n) {
            element = e;
            next = n;
            penultimate = null;
        }
        public Integer getElement() {return element;}
        public Node<Integer> getNext(){return next;}
        public void setNext(Node<Integer> n) {next = n;}
        public Node<Integer> penultimate(Node<Integer> head) {
            Node<Integer> current = head;
            while(current != null) {
                if(head.getNext() == null) {
                    penultimate = head;
                }
                else {
                    current = current.getNext();
                }
            }
            return penultimate;
        }
    }

    private Node<Integer> head = null;
    private Node<Integer> tail = null;
    private int size = 0;

    public SinglyLinkedList() {}

        public int size() {
            return size;
        }
        public boolean isEmpty() {
            return size == 0;
        }
        public Integer first() {
            if (isEmpty()) {
                return null;
            }
            return head.getElement();
        }
        public Integer last() {
            if(isEmpty()) {
                return null;
            }
            return tail.getElement();
        }
        public void addFirst(Integer i) {
            head = new Node<> (i, head);
            if(size == 0) {
                tail = head;
            }
            size++;
        }
        public void addLast(Integer i) {
            Node<Integer> newest = new Node<>(i,null);
            if(isEmpty()) {
                head = newest;
            }
            else {
                tail.setNext(newest);
            tail = newest;
            size++;
            }
        }
        public Integer removeFirst() {
            if(isEmpty()) {
                return null;
                }
            Integer answer = head.getElement();
            head = head.getNext();
            size--;
            if(size == 0) {
                tail = null;
            }
            return answer;
        }
        public void getPenultimate() {

            if(isEmpty()) {
                System.out.println("List is empty. Please check.");
            }
            else {
                System.out.println("The second last node is: " + head.penultimate(head));
            }

        }

最佳答案

删除字段 penultimate。你不希望它在每个节点,实际上在没有节点,而是计算出来的。

在 Node 的倒数第二个方法中,head 不应在循环中使用。

//private Node<Integer> penultimate;

// head: ...#->#->#->P->null
public Node<Integer> penultimate(Node<Integer> head) {
    Node<Integer> penultimate = null;
    Node<Integer> current = head;
    while (current != null) {
        if (current.getNext() == null) {
            penultimate = current;
            break;
        }
        current = current.getNext();
    }
    return penultimate;
}

或者倒数第三个(第二个?)节点:

// head: ...#->#->#->P->#->null
public Node<Integer> penultimate(Node<Integer> head) {
    Node<Integer> penultimate = null;
    Node<Integer> current = head;
    while (current != null) {
        if (current.getNext() == null) {
            break;
        }
        penultimate = current;
        current = current.getNext();
    }
    return penultimate;
}

关于java - 在单链表中查找倒数第二个节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54401771/

相关文章:

java - 扩展 MongoRepository 的存储库的 REST 端点未映射

java - 即使在自定义插件中使用显式绑定(bind),m2e 仍然会报错 "Plugin execution not covered by lifecycle configuration"

list - 使用angularjs选择多个列表项

Java List `of` 方法相当困惑

c - 在 C 中的节点或元素中插入新数据时出现链表错误

java - 如何从数据库中绘制与前一行具有相同ID但来自不同表的行?

c++ - 在 STL 列表中找到一对,其中只有第一个元素是已知的

c++ - 删除单链表最后一个元素的递归方法?

C++链表指针总是nullptr

java - 为什么发送到新(动态)实例的请求多于发送到常驻实例的请求?