firstLast Java链接列表/节点

时间:2017-07-22 13:17:22

标签: java nodes

我对每个节点如何链接到另一个节点感到困惑,以及如何确保如果我希望第一个节点在最后一个节点之后链接,我没有运行无限循环。例如,在这个问题..

编写一个可以添加到LinkedIntList类的方法firstLast,该类将列表的第一个元素移动到列表的后端。假设名为list的LinkedIntList变量存储从前(左)到后(右)的以下元素:

[18,4,27,9,54,5,63] 如果您调用了list.firstLast();,那么列表将按以下顺序存储元素:

[4,27,9,65,5,63,18] 如果列表为空或只有一个元素,则不应修改其内容。

我的第一次尝试就是这样做......但无济于事:

`public void firstLast(){
    ListNode temp = front;//stores/references the first node
    temp.next = null;//ensures that first node isn't referring to any other 
//node
    ListNode current = front;//reaches end node/first one with a null 
//reference
    while(current.next != null){
        current = current.next;
    }
    front.next = temp;//links end node to first node
    front = current.next;////now that skips the first element`

但输出为[18] -> [18] (cycles!)。请指教

3 个答案:

答案 0 :(得分:4)

函数firstLast()可以编码如下:

public void firstLast()
{
    ListNode temp = removeFirst();
    appendLast( temp );
}

所以,现在你已经将问题分解为两个较小的问题。这往往是解决任何问题的非常好的策略。

为了实现removeFirst(),您需要记住的一点是,您必须修改front以指向第二个节点front.next

答案 1 :(得分:3)

  

我对每个节点如何链接到另一个

感到困惑

在单链表中,每个节点只知道下一个节点。 所以你需要跟踪第一个, 通常称为head(在您的实施中,它是"前面"), 因为访问所有元素至关重要。

  

...以及如何确保如果我希望第一个节点在最后一个节点之后链接,我没有运行无限循环。

最后一个节点后面没有下一个节点,所以它的next指针是null。 您可以使用此条件来避免无限循环。 (只需确保最后一个节点next正确为null。)

您的实施可以修复为:

public void firstLast() {
    // list is empty or has single element -> nothing to do
    if (front == null || front.next == null) {
        return;
    }

    // save the first
    ListNode first = front;

    // move the head
    front = front.next;

    // find the end
    ListNode current = front;
    while (current.next != null) {
        current = current.next;
    }

    // append the node
    current.next = first;

    // reset the next pointer of the new last node
    first.next = null;
}

答案 2 :(得分:1)

鉴于你的实施:

void push(ListItem item) {
    end.next = item;
    item.next = null;
}

ListItem pop() {
    ListItem first = front;
    front = front.next;
    return first;
}

你的方法变成:

void firstLast() {
    push(pop());
}

注意:未经测试的代码,不检查 null 或列表大小。