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

时间:2019-01-28 12:12:18

标签: java list singly-linked-list

因此,我有一个单链接列表的实现,并且我尝试添加一种报告列表的倒数第二个节点的方法。但是,我不确定是否可以在Node类下编写该方法,然后从Singly Linked List类访问它。如果这样做,则将节点类的实例变量“ 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));
            }

        }

2 个答案:

答案 0 :(得分:1)

删除字段penultimate。您不希望在每个节点中都需要它,实际上在任何节点中都不需要,而是要经过计算。

不应在循环中使用节点的倒数第二个方法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;
}

答案 1 :(得分:0)

为什么不跟踪倒数第二个节点?

private Node<Integer> head = null;
private Node<Integer> tail = null;
private Node<Integer> secondToLast = 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) {
    if (size == 1) {
        secondToLast = head;
    }
    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);
        secondToLast = tail;
    }
    tail = newest;
    size++;

}
public Integer removeFirst() {
    if(isEmpty()) {
        return null;
        }
    Integer answer = head.getElement();
    head = head.getNext();
    size--;
    if(size == 0) {
        tail = null;
    }
    if (size == 1) {
        secondToLast = 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: " + secondToLast);
    }

}