有关遍历,插入和删除节点的问题

时间:2017-06-22 23:25:23

标签: java nodes next

刚开始学习节点,我有几个问题。假设我有一个如下所示的节点类:

    private E number;
    private Node next;
    /**
     *  Constructor
     */
    Node(E e){
       number = e;
       next = null;
    }

我有一系列链接节点,起始节点名为first,如下所示:

一阶>(1) - >(2) - >(3) - >(5) - >(6)

假设列表不为空,要遍历列表,我会这样做:

Node curr = first;
while(curr != null){
    System.out.print(curr);
    curr = curr.next;
}

我知道你不能向后遍历这样的链接列表,所以这是否意味着每当我调用curr.next时,之前的元素都会丢失?

我还想知道我的原始列表是否会受到像curr这样的临时节点列表的影响?例如,如果我要插入或删除列表中的节点,其代码类似于:

插入:

Node curr = first;
Node newNode = new Node(4);
while(curr != null){
    if(curr.number == 3){
        newNode.next = curr.next;
        curr.next = newNode;
    }
    curr = curr.next;
}

删除:

Node curr = first;
Node parent = first;
while(curr != null){
    if(curr.number == 3){
        parent.next = curr.next;
    }
    parent = curr;
    curr = curr.next;
}

上述代码会先修改,还是在插入或删除更改后必须设置first = curr;?如果他们先修改,curr = curr.next;怎么不先修改?如果我想返回已删除的节点怎么办?我会做curr.next = null;然后return curr;吗?

1 个答案:

答案 0 :(得分:0)

  

这是否意味着每当我调用curr.next时,之前的元素都会丢失?

当您浏览列表时,您从未修改过first,并且您从未修改任何next的{​​{1}}链接。所以没有节点真的丢失了。以前访问过的节点只是变得不那么方便访问,因为你没有“句柄”,但你总是可以通过从列表的头部(Node)开始并且跟随first个链接。

  

我还想知道我的原始列表是否会受到像curr这样的临时节点列表的影响?

变量next永远不会受first左侧first赋值语句以外的任何内容的影响。另一方面,=引用的列表可能会发生相当大的变化或完全不受影响,具体取决于您使用first的内容,但curr本身只能通过分配来影响first的新值。

  

上面的代码会先修改,还是必须先设置= curr;

给定的插入和删除代码永远不会修改first。但它应该,如果它能够处理在当前第一个节点之前插入新节点,或者删除当前第一个节点。也许不是first具体,但first = curr肯定需要更新以反映列表的新头。正如教科书所说,我把它留作“作为读者的练习”。