关于遍历、插入、删除节点的问题
Posted
技术标签:
【中文标题】关于遍历、插入、删除节点的问题【英文标题】:Questions about traversing, inserting, and deleting nodes 【发布时间】:2017-06-22 23:25:22 【问题描述】:刚开始学习节点,我有几个问题。假设我有一个如下所示的节点类:
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;
的事情吗?
【问题讨论】:
【参考方案1】:这是否意味着每当我调用 curr.next 之前的元素都会丢失?
当您遍历列表时,您从未修改过first
,也从未修改过任何Node
的next
链接。因此,没有一个节点会真正丢失。以前访问过的节点只是变得不那么方便访问了,因为它们没有“句柄”,但是您总是可以通过从列表的开头(first
)开始并按照@987654325再次找到它们@链接。
我还想知道首先,我的原始列表是否会受到像 curr 这样的临时节点列表的影响?
变量first
永远不会受到除first
左侧有first
的赋值语句之外的任何东西@ 的影响。另一方面,first
所指的列表可能会发生很大变化或完全不受影响,具体取决于您使用curr
的目的,但first
本身只能通过为@987654332 分配新值来影响@。
上面的代码是先修改还是先设置=curr;
给定的插入和删除代码永远不会修改first
。但它应该,如果它能够处理在当前第一个节点之前插入一个新节点,或者删除当前第一个节点。也许不是专门针对first = curr
,但first
肯定需要更新以反映列表的新负责人。正如教科书所说,我将其保留为“作为读者的练习”。
【讨论】:
感谢您的回答!我想我明白了。first
将在任何引用它的内容被修改时更改;否则,我必须更新它才能发生更改。以上是关于关于遍历、插入、删除节点的问题的主要内容,如果未能解决你的问题,请参考以下文章