刚开始学习节点,我有几个问题。假设我有一个如下所示的节点类:
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;
吗?
答案 0 :(得分:0)
这是否意味着每当我调用curr.next时,之前的元素都会丢失?
当您浏览列表时,您从未修改过first
,并且您从未修改任何next
的{{1}}链接。所以没有节点真的丢失了。以前访问过的节点只是变得不那么方便访问,因为你没有“句柄”,但你总是可以通过从列表的头部(Node
)开始并且跟随first
个链接。
我还想知道我的原始列表是否会受到像curr这样的临时节点列表的影响?
变量next
永远不会受first
左侧first
赋值语句以外的任何内容的影响。另一方面,=
引用的列表可能会发生相当大的变化或完全不受影响,具体取决于您使用first
的内容,但curr
本身只能通过分配来影响first
的新值。
上面的代码会先修改,还是必须先设置= curr;
给定的插入和删除代码永远不会修改first
。但它应该,如果它能够处理在当前第一个节点之前插入新节点,或者删除当前第一个节点。也许不是first
具体,但first = curr
肯定需要更新以反映列表的新头。正如教科书所说,我把它留作“作为读者的练习”。