2017-06-22 77 views
0

刚开始学习节点,我有几个问题。比方说,我有一个节点类,看起来像这样:关于遍历,插入和删除节点的问题

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

和我有起始节点的一系列链接节点的第一个命名的,像这样:

第一 - >(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;

回答

0

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

当你走过下来列表中,你永远不会修改first,你永远不修改任何Nodenext链接。所以没有节点真的丢失。之前访问过的节点访问起来不方便,因为您没有“处理”,但您可以从列表头(first)开始,然后从next链接开始重新找到它们。

我还想知道,如果我的原始列表首先受到像curr这样的临时节点列表的影响吗?

变量first绝不会比其在=的左侧first赋值语句之外的任何影响。另一方面,first所引用的列表可能会相当戏剧性地改变或完全不受影响,具体取决于您使用的是curr,但first本身只能通过将新值分配给first而受到影响。

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

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

+0

感谢您的回答!我想我明白了。如果引用它的任何内容被修改,“first”将会改变;否则,我将不得不更新它以发生更改。 –